判断最小生成树是不是唯一。
#include<stdio.h> #include<string.h> #include<stdlib.h> const int maxn=110,maxm=10010,INF=100000000; struct node{ int x,y,w,f; }; struct node a[maxm],tmp; int f[maxn],rank[maxn],pre[maxn],pres[maxn],p[maxn],n,ansx[maxm]; int e,to[maxm],next[maxm],begin[maxn],ss[maxm]; void qsort(int l,int r){ int mid=a[(l+r)/2].w,i,j; i=l;j=r; while(i<j){ while(i<=j && a[i].w<mid)i++; while(i<=j && a[j].w>mid)j--; if(i<=j){ tmp=a[i];a[i]=a[j];a[j]=tmp; i++;j--; } } if(l<j)qsort(l,j); if(i<r)qsort(i,r); } int fa(int u){ if(f[u]!=u) f[u]=fa(f[u]); return f[u]; } int find(int u,int v){ return fa(u)==fa(v)?0:1; } void link(int u,int v){ if(rank[fa(u)]>=rank[fa(v)]){ f[fa(v)]=fa(u); rank[fa(u)]++; }else{ f[fa(u)]=fa(v); rank[fa(v)]++; } } void dfs(int u,int v){ int i,j,k; if(u==v)return; p[u]=1; for(i=begin[u];i;i=next[i]){ k=to[i]; if(!p[k]){ pre[k]=u; pres[k]=ss[i]; dfs(k,v); } } } int main(){ #ifndef ONLINE_JUDGE freopen("prim2.in","r",stdin); //freopen("cprim.out","w",stdout); #endif int i,j,k,m,s; int T; scanf("%d",&T); while(T--){ memset(f,0,sizeof(f)); memset(rank,0,sizeof(rank)); memset(p,0,sizeof(p)); memset(begin,0,sizeof(begin)); memset(next,0,sizeof(next)); e=0; scanf("%d%d",&n,&m); for(i=1;i<=n;i++)f[i]=i; for(i=1;i<=m;i++){ scanf("%d%d%d",&a[i].x,&a[i].y,&a[i].w); a[i].f=0; } qsort(1,m); s=n-1;i=0; int ans=0; while(s && i<=m){ i++; if(find(a[i].x,a[i].y)){ link(a[i].x,a[i].y); to[++e]=a[i].y; next[e]=begin[a[i].x]; begin[a[i].x]=e; ss[e]=a[i].w; to[++e]=a[i].x; next[e]=begin[a[i].y]; begin[a[i].y]=e; ss[e]=a[i].w; a[i].f=1; s--; ans+=a[i].w; } } int t=0; for(i=1;i<=m;i++){ if(a[i].f==0){ memset(p,0,sizeof(p)); dfs(a[i].x,a[i].y); j=a[i].y; int max=0; while(j!=a[i].x){ if(pres[j]>max) max=pres[j]; j=pre[j]; } ansx[++t]=ans-max+a[i].w; } } int flag=1; for(i=1;i<=t;i++) if(ansx[i]==ans){ flag=0; break; } if(flag)printf("%d\n",ans); else puts("Not Unique!"); } return 0; }