您的位置:首页 > 其它

hdu 1863 畅通工程(最小生成树,kruskal)

2016-06-13 20:16 330 查看
#include <cstdio>
#include <algorithm>
using namespace std;
struct node
{
int u,v,w;
};
node e[5005];
int f[101];
int n,m;

bool cmp(node& a , node& b)
{
return a.w < b.w;
}

int getf(int x)
{
if(x == f[x])
return x;
else
{
f[x] = getf(f[x]);
return f[x];
}
}

int merges(int x, int y)
{
int t1,t2;
t1 = getf(x);
t2 = getf(y);
if(t1 != t2)
{
f[t2] = t1;
return 1;
}
return 0;
}

int main()
{
while(scanf("%d %d",&m,&n) && m)
{
for(int i = 1; i <= m; ++i)
scanf("%d %d %d",&e[i].u,&e[i].v,&e[i].w);

sort(e+1,e+m+1,cmp);

for(int i = 1; i <= n; ++i)
f[i] = i;

int sum = 0, counts = 0,flag = 0;
for(int i = 1; i <= m; ++i)
{
if(merges(e[i].u,e[i].v))
{
++counts;
sum += e[i].w;
}
if(counts == n-1)
{
flag = 1;
break;
}
}
if(flag)
printf("%d\n",sum);
else
printf("?\n");
}
return 0;
}

上边的代码15ms,

下边的0ms

#include <iostream>
#include <algorithm>
using namespace std;
int n,m;
int f[101],u[5005],v[5005],w[5005],r[5005];

bool cmp(const int& i, const int& j)
{
return w[i] < w[j];
}

int getf(int x)
{
return f[x] == x ? x:(f[x] = getf(f[x]));
}

int main()
{
int sum,counts;
while((cin >> m >> n) && m)
{
sum = 0;
counts = 0;
for(int i = 0; i < m; ++i)
cin >> u[i] >> v[i] >> w[i];

for(int i = 0; i < m; ++i) r[i] = i;
for(int i = 0; i <= n; ++i) f[i] = i;

sort(r,r+m,cmp);
for(int i = 0; i < m; ++i)
{
int e = r[i];
int x = getf(u[e]);
int y = getf(v[e]);
if(x != y)
{
++counts;
sum += w[e];
f[y] = x;
}
}
if(counts == n-1)
cout << sum << endl;
else
cout << "?" << endl;
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: