Time Limit: 1000MS | Memory Limit: 10000K | |
Total Submissions: 16690 | Accepted: 5782 |
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
#include<iostream> #include<cstdio> #include<cstring> #include<algorithm> using namespace std; const int VM=120; const int EM=10010; struct Edge{ int u,v; int cap; }edge[EM]; int n,m,flag; int mst,father[VM]; void makeSet(){ for(int i=1;i<=n;i++){ father[i]=i; } } int findSet(int x){ if(x!=father[x]){ father[x]=findSet(father[x]); } return father[x]; } int cmp(Edge a,Edge b){ return a.cap<b.cap; } void Kruskal(){ makeSet(); sort(edge,edge+m,cmp); int path[EM],cnt=0; mst=0; for(int i=0;i<m;i++){ int u=findSet(edge[i].u); int v=findSet(edge[i].v); if(u!=v){ father[v]=u; path[cnt++]=i; //记录路径 mst+=edge[i].cap; } } for(int k=0;k<cnt;k++){ //枚举去掉每一条边 makeSet(); int sum=0,j=0; for(int i=0;i<m;i++){ if(i==path[k]) continue; int u=findSet(edge[i].u); int v=findSet(edge[i].v); if(u!=v){ father[v]=u; sum+=edge[i].cap; j++; } } if(j==n-1 && sum==mst){ //判断是否能构成树 且 是否与最小生成树相等 flag=0; return ; } } } int main(){ //freopen("input.txt","r",stdin); 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].cap); flag=1; Kruskal(); if(flag) printf("%d\n",mst); else printf("Not Unique!\n"); } return 0; }