您的位置:首页 > 其它

hdu 1863 最小生成树+并查集 (Kruskal)

2018-03-12 21:13 369 查看
水题,直接上代码。
#include <cstdio>
#include <iostream>
#include <algorithm>
using namespace std;
int n, m;
int p[1111], u[1111], v[1111], w[1111], r[1111];

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

int find( int x )
{
if( p[x] == x )
return x;
return p[x] = find( p[x] );
}

int main()
{
while( scanf("%d", &n) && n != 0 )
{
scanf("%d", &m);
for( int i = 1; i <= n; i++ )
scanf( "%d%d%d", &u[i], &v[i], &w[i] );
for( int i = 1; i <= m; i++) p[i] = i;
for( int i = 1; i <= n; i++) r[i] = i;
sort(r, r + n, cmp);
int q = 0;
int ans = 0;
for( int i = 1; i <= n; i++)
{
int e = r[i];
int x = find( u[e] );
int y = find( v[e] );
if( x != y)
{
ans += w[e];
p[x] = y;
q++;
}
}
if( q != m - 1 )
printf("?\n");
if( q == m - 1 )
printf("%d\n",ans);
}
return 0;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: