标签:
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=1102
#include<iostream> #include<cstring> using namespace std; const int INF = 0x3f3f3f3f; int n, q, ans; int map[105][105]; int father[105]; bool flag[105]; int dis[105]; int findfather( int x ){ while( x != father[x] ) x = father[x]; return x; } void prim(){ ans = 0; memset( flag, false, sizeof( flag ) ); for( int i = 1; i <= n; i++ ) dis[i] = map[1][i]; flag[1] = true; for( int t = 1; t < n; t++ ){ int min = INF, mini; for( int i = 1; i <= n; i++){ if( flag[i] ) continue; if( findfather( i ) == findfather( 1 ) ){ //使用并查集来进行区分合并 mini = i; min = 0; break; } if( dis[i] < min ){ min = dis[i]; mini = i; } } flag[mini] = true; ans += min; father[findfather( mini )] = findfather( 1 ); for( int j = 1; j <= n; j++ ) if( dis[j] > map[mini][j] ){ dis[j] = map[mini][j]; } } } int main(){ cin >> n; for( int i = 1; i <= n; i++ ){ father[i] = i; for(int j = 1; j <= n; j++ ) cin >> map[i][j]; } cin >> q; int a,b; for( int i = 0; i < q; i++ ){ cin >> a >> b; father[findfather( a )] = father[findfather( b )]; } prim(); cout << ans << endl; return 0; }
HDU-1102 Constructing Roads ( 最小生成树 )
标签:
原文地址:http://www.cnblogs.com/hollowstory/p/5321523.html