标签:
Time Limit: 1000MS | Memory Limit: 10000K | |
Total Submissions: 44670 | Accepted: 18268 |
Description
Input
Output
Sample Input
4 0 4 9 21 4 0 8 17 9 8 0 16 21 17 16 0
Sample Output
28
求把所有town连接起来所需最少边权值和,把边权值按从小到大排序,如果当前边权值连接的两边没有关系就把当前边权值相加,如果有关系当前值就没有价值,不用浪费资源联通这两个town。到最后肯定会把所有town连接~
#include<iostream> #include<algorithm> using namespace std; #define N 1000005 int k, n, a, f[N]; struct node { int x, y, w; }P[N]; int cmp(const void *u, const void *b) { node c, d; c = *(node *)u; d = *(node *)b; return c.w-d.w; } void init() { for(int i = 1; i < N; i++) f[i] = i; } int found(int a) { if(f[a] != a) f[a] = found(f[a]); return f[a]; } int main() { while(cin >> n) { k = 0; init(); for(int i = 1; i <= n; i++) for(int j = 1; j <= n; j++) { cin >> a; P[k].w = a; P[k].x = i, P[k].y = j; k++; } qsort(P, k, sizeof(P[0]), cmp); int ans = 0; for(int i = 0; i < k; i++) { int nx = found(P[i].x), ny = found(P[i].y); if(nx != ny) { f[nx] = ny; ans += P[i].w; } } //int ans = kuscral(1, n); cout << ans << endl; } return 0; }
标签:
原文地址:http://www.cnblogs.com/Tinamei/p/4675884.html