http://poj.org/problem?id=2485
Time Limit: 1000MS | Memory Limit: 65536K |
Description
Input
Output
Sample Input
1 3 0 990 692 990 0 179 692 179 0
Sample Output
692
/* Author : yan * Question : POJ 2485 Highways * Date && Time : Wednesday, February 16 2011 04:28 PM * Compiler : gcc (Ubuntu 4.4.3-4ubuntu5) 4.4.3 */ #include<stdio.h> #define MAX 501 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() { ans=-1; route_cnt=0; unsigned int i; memset(rank,0,sizeof(rank)); 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=ans>w?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 int n,i,j,test; scanf("%d",&test); while(test--) { initial(); scanf("%d",&n); for(i=0;i<n;i++) { for(j=0;j<n;j++) scanf("%d",&map[i][j]); } 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/n",ans); } return 0; }