Not Unique!
题意:求出最小生成树是不是唯一的。
写的比较麻烦,把最小生成树求一次,每一条边都存下来,然后每次去掉其中一条边,再一次求最小生成树,比较权值。
#include<stack> #include<queue> #include<math.h> #include<vector> #include<string> #include<stdio.h> #include<iostream> #include<string.h> #include<map> #include<algorithm> #define maxn 10005 #define MAXN 10000 #define MAXM 10005 #define mem(a,b) memset(a,b,sizeof(a)) #define ll long long #define inf 0x3f3f3f3f using namespace std; struct node{ int x,y,z,id; }d[maxn],d1[maxn]; int mark[maxn]; int f[maxn]; int fin(int x){ if(f[x]==x) return x; else return f[x]=fin(f[x]); } bool join(int a,int b){ int x=fin(a),y=fin(b); if(x!=y){ f[x]=y;return true; } return false; } bool cmp(node n,node m){ return n.z<m.z; } void init(int n){ for(int i=0;i<=n;i++)f[i]=i; } int main(){ int t;scanf("%d",&t); while(t--){ mem(d,0);mem(d1,0);mem(mark,0); int n,m;scanf("%d%d",&n,&m); init(n); for(int i=0;i<m;i++){ scanf("%d%d%d",&d[i].x,&d[i].y,&d[i].z); } sort(d,d+m,cmp);int x=0,ans1=0,ans2=0,l=0; for(int i=0;i<m;i++){ if(join(d[i].x,d[i].y)){ x++;ans1+=d[i].z; mark[l++]=i; } if(x==n-1)break; } int y=inf,flag=0; for(int i=0;i<l;i++){ swap(y,d[mark[i]].z); memcpy(d1,d,sizeof(d1)); sort(d1,d1+m,cmp); x=0;ans2=0; init(n); for(int j=0;j<m;j++){ if(join(d1[j].x,d1[j].y)){ x++;ans2+=d1[j].z;} if(x==n-1)break; }swap(y,d[mark[i]].z); if(ans1==ans2){flag=1;break;} } if(flag==0)printf("%d\n",ans1); else printf("Not Unique!\n"); } }