ZOJ 1406 Jungle Roads (kruskal)

史上最水最小生成树,不解释,不注释。

 

#include<iostream> using namespace std; int u[500],v[500],w[500]; int r[500],p[500];; int a,b,counter,n; int cases,i,j; char c[5]; int cmp(const int i,const int j) {return w[i]<w[j];} int find(int x) {return p[x]==x?x:p[x]=find(p[x]);} int kruskal(void) { int ans = 0; for(int i = 1; i <= n; i++) p[i] = i; for(int i = 1; i <= counter; i++) r[i] = i; sort(r,r+counter+1,cmp); for(int i = 1; i <= counter; i++) { int e = r[i]; int x = find(u[e]),y = find(v[e]); if( x - y ) { ans += w[e]; p[x] = y; } } return ans; } int main(void) { while( cin >> n && n ) { counter = 0; for(i = 1; i < n; i++ ) { cin >> c; a = c[0] - 'A' + 1; cin >> cases; for( j = 1;j <= cases; j++ ) { counter++; cin >> c; b = c[0] - 'A' + 1; u[counter] = a; v[counter] = b; cin >> w[counter]; } } cout << kruskal() << endl; } return 0; }

你可能感兴趣的:(ZOJ 1406 Jungle Roads (kruskal))