Online Judge | Problem Set | Authors | Online Contests | User | ||||||
---|---|---|---|---|---|---|---|---|---|---|
Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest |
ac//问最小生成树是否唯一 #include<stdio.h> #include<string.h> #include<algorithm> #define INF 0x3f3f3f3f using namespace std; struct node { int x; int y; int len; }num[100000]; bool cmp(node a,node b) { return a.len<b.len; } int mincost=0; int p; int f[1000]; int r[1000]; int a[1000]; int find(int n) { if(f[n]==n) return n; else f[n]=find(f[n]); return f[n]; } int UU(int x,int y) { int xa; int ya; xa=find(x); ya=find(y); if(xa==ya) { return 0; } else if(r[xa]<=r[ya]) { f[xa]=ya; r[ya]+=r[xa]; } else { f[ya]=xa; r[xa]+=r[ya]; } return 1; } int ki(int n,int m) { mincost=0; int temp=INF; p=0; int i,j; for(i=1;i<=n;i++) { f[i]=i; r[i]=1; } for(i=1;i<=m;i++) { scanf("%d%d%d",&num[i].x,&num[i].y,&num[i].len); } sort(num+1,num+1+m,cmp); int num1=0; for(i=1;i<=m;i++) { if(UU(num[i].x,num[i].y)) { num1++; p++; a[p]=i; mincost+=num[i].len; } if(num1==n-1) break; } int scost; for(i=1;i<=n-1;i++) { scost=0; num1=0; for(j=1;j<=n;j++) { f[j]=j; r[j]=1; } for(j=1;j<=m;j++) { if(j==a[i]) { continue; } if(UU(num[j].x,num[j].y)) { scost+=num[j].len; num1++; } if(num1==n-1) { break; } } if(num1==n-1&&scost<temp) temp=scost; } if(temp==mincost) return 0; else return 1; } int main() { int T; scanf("%d",&T); while(T--) { int i; int j; scanf("%d%d",&i,&j); if(ki(i,j)) { printf("%d\n",mincost); } else { printf("Not Unique!\n"); } } return 0; } Followed by: Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator