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
#include<stdio.h> #include<string.h> #include<algorithm> #include<iostream> using namespace std; const int maxn=110000; struct Node { int from; int to; int w; bool operator<(const Node &c)const { return w<c.w; } } E[maxn]; struct Node2 { int x,y; } k[maxn]; int p[maxn]; int n,m; int cha(int x) { if(p[x]==-1) return x; return p[x]=cha(p[x]); } void lxsb() { int ans=0,cnt=0,f=0; for(int i=0; i<m; i++) { int x=cha(E[i].from); int y=cha(E[i].to); if(x!=y) { ans+=E[i].w;p[x]=y; if(E[i].w==0) continue;//去除那些权值为0的情况。删除权值为0的结点,求出的最小生成树不影响 k[cnt].x=E[i].from; k[cnt].y=E[i].to; cnt++; } } int sum=0; for(int j=0; j<cnt;j++) { sum=0; memset(p,-1,sizeof(p));//注意这里要初始化~ for(int i=0; i<m; i++) { int x=cha(E[i].from); int y=cha(E[i].to); if(E[i].from==k[j].x&&E[i].to==k[j].y) continue; if(x!=y) { sum+=E[i].w; p[x]=y; } } if(sum==ans) { f=1; break; } } if(f) puts("Not Unique!"); else printf("%d\n",ans); } int main() { int t; scanf("%d",&t); while(t--) { memset(p,-1,sizeof(p)); scanf("%d%d",&n,&m); for(int i=0; i<m; i++) scanf("%d%d%d",&E[i].from,&E[i].to,&E[i].w); sort(E,E+m); lxsb(); } return 0; } /* 附上一组测试数据 1 6 7 1 3 1 1 2 2 2 3 3 3 4 0 4 6 5 4 5 4 5 6 6 */