Time Limit: 1000MS | Memory Limit: 10000K | |
Total Submissions: 25387 | Accepted: 9061 |
Description
Input
Output
Sample Input
2 3 3 1 2 1 2 3 2 3 1 3 4 4 1 2 2 2 3 2 3 4 2 4 1 2
Sample Output
3 Not Unique!
Source
POJ Monthly--2004.06.27 srbga@POJ
#include<stdio.h> #include<string.h> #include<algorithm> using namespace std; struct node { int u,v; int val,flag; }edge[10010]; int n,m,minn,flag,pre[10010]; void init() { for(int i=0;i<=n;i++) pre[i]=i; } int cmp(node s1,node s2) { return s1.val<s2.val; } int find(int x) { return pre[x]==x?x:find(pre[x]); } int F(int w) { int sum=0; for(int i=0;i<m;i++) { if(i!=w) { int fx=find(edge[i].u); int fy=find(edge[i].v); if(fx!=fy) { pre[fx]=fy; sum+=edge[i].val; } } } int s=find(1); for(int i=2;i<=n;i++) if(find(i)!=s) return -1; return sum; } int main() { int t; scanf("%d",&t); while(t--) { scanf("%d%d",&n,&m); for(int i=0;i<m;i++) { scanf("%d%d%d",&edge[i].u,&edge[i].v,&edge[i].val); edge[i].flag=0; } sort(edge,edge+m,cmp); minn=0; init(); for(int i=0;i<m;i++) { int fx=find(edge[i].u); int fy=find(edge[i].v); if(fx!=fy) { pre[fx]=fy; edge[i].flag=1; minn+=edge[i].val; } } // printf("%d\n",minn); flag=0; for(int i=0;i<m;i++) { if(edge[i].flag) { init(); if(F(i)==minn) { flag=1; break; } } } if(flag) printf("Not Unique!\n"); else printf("%d\n",minn); } return 0; }