http://poj.org/problem?id=2421
无向图的最小生成树 Kruskal算法
Time Limit: 2000MS | Memory Limit: 65536K |
Description
Input
Output
Sample Input
3 0 990 692 990 0 179 692 179 0 1 1 2
Sample Output
179
/* Author : yan * Question : POJ 2421 Constructing Roads * Date && Time : Saturday, January 29 2011 05:27 PM * Compiler : gcc (Ubuntu 4.4.3-4ubuntu5) 4.4.3 */ #include<stdio.h> #define MAX 101 int map[MAX][MAX]; int father[MAX]; int rank[MAX]; typedef struct _route { int x,y; int weight; }Route; Route route[MAX*MAX/2]; int route_cnt; int ans; void initial() { unsigned i; for(i=0;i<MAX;i++) father[i]=i; } int Find_Set(int x) { if(x!=father[x]) father[x]=Find_Set(father[x]); return father[x]; } int Union_Set(int x,int y,int w) { int a=Find_Set(x); int b=Find_Set(y); if(a==b) return 0; if(rank[x]<rank[y]) { father[a]=b; } else { father[b]=a; if(rank[x]==rank[y]) rank[x]++; } ans+=w; return 1; } int cmp(const void *a,const void *b) { return (*(Route *)a).weight - (*(Route *)b).weight; } int main() { //freopen("input","r",stdin); unsigned n,i,j; initial(); scanf("%d",&n); for(i=0;i<n;i++) { for(j=0;j<n;j++) scanf("%d",&map[i][j]); } unsigned q; scanf("%d",&q); unsigned x,y; for(i=0;i<q;i++) { scanf("%d %d",&x,&y); x--,y--; map[x][y]=0; map[y][x]=0; } for(i=0;i<n;i++) { for(j=i+1;j<n;j++) { route[route_cnt].x=i; route[route_cnt].y=j; route[route_cnt].weight=map[i][j]; route_cnt++; } } qsort(route,route_cnt,sizeof(route[0]),cmp); for(i=0;i<route_cnt;i++) { Union_Set(route[i].x,route[i].y,route[i].weight); //printf("%d %d %d/n",route[i].x,route[i].y,route[i].weight); } printf("%d",ans); return 0; }