判断MST是不是唯一的 如果是唯一的 就输出最小的权值和 如果不是唯一的 就输出Not Unique!
先求出最小的权值和 然后一条边一条边的删
先标记MST中所使用的边 删边就是屏蔽这条边后 再对剩下的边求MST 如果最后的权值和 与开始算出的最小的那个 相等 就说明不是唯一的
Sample Input
2 //T
3 3 //n m
1 2 1// u v w
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!
Kruskal
1 # include <iostream> 2 # include <cstdio> 3 # include <cstring> 4 # include <algorithm> 5 # include <cmath> 6 # define LL long long 7 using namespace std ; 8 9 int n ; 10 const int MAXN=110;//最大点数 11 const int MAXM=10000;//最大边数 12 int F[MAXN];//并查集使用 13 int del[MAXM] ; 14 struct Edge 15 { 16 int u,v,w; 17 int tag ; 18 }edge[MAXM];//存储边的信息,包括起点/终点/权值 19 20 int tol;//边数,加边前赋值为0 21 void addedge(int u,int v,int w) 22 { 23 24 edge[tol].u=u; 25 edge[tol].v=v; 26 edge[tol].tag = 0 ; 27 edge[tol++].w=w; 28 } 29 bool cmp(Edge a,Edge b) 30 {//排序函数,讲边按照权值从小到大排序 31 return a.w<b.w; 32 } 33 int find(int x) 34 { 35 if(F[x]==-1)return x; 36 else return F[x]=find(F[x]); 37 } 38 int Kruskal(int d)//传入点数,返回最小生成树的权值,如果不连通返回-1 39 { 40 memset(F,-1,sizeof(F)); 41 42 int cnt=0;//计算加入的边数 43 int ans=0; 44 for(int i=0;i<tol;i++) 45 { 46 if (i == d) //屏蔽id为d的这一条边 47 continue ; 48 int u=edge[i].u; 49 int v=edge[i].v; 50 int w=edge[i].w; 51 int t1=find(u); 52 int t2=find(v); 53 if(t1!=t2) 54 { 55 ans+=w; 56 F[t1]=t2; 57 cnt++; 58 edge[i].tag = 1 ; 59 } 60 if(cnt==n-1)break; 61 } 62 if(cnt<n-1)return -1;//不连通 63 else return ans; 64 } 65 66 int main() 67 { 68 69 // freopen("in.txt","r",stdin) ; 70 int m ; 71 int T ; 72 scanf("%d" , &T) ; 73 while(T--) 74 { 75 scanf("%d %d" , &n , &m) ; 76 int i ; 77 int u , v , w ; 78 tol = 0 ; 79 while(m--) 80 { 81 scanf("%d %d %d" , &u , &v , &w) ; 82 addedge(u , v , w) ; 83 } 84 85 sort(edge,edge+tol,cmp); 86 int ans = Kruskal(-1) ; 87 88 int k = 0 ; 89 for (i = 0 ; i < tol ; i++) 90 { 91 if (edge[i].tag == 1 ) 92 { 93 del[k] = i ; 94 k++ ; 95 } 96 } 97 bool flag = 0 ; 98 int t_ans ; 99 for (i = 0 ; i < k ; i++) 100 { 101 t_ans = Kruskal(del[i]) ; 102 if (t_ans == ans) 103 { 104 flag = 1 ; 105 break ; 106 } 107 } 108 if (flag) 109 printf("Not Unique!\n") ; 110 else 111 printf("%d\n" , ans) ; 112 113 } 114 return 0 ; 115 }
时间: 2024-10-09 15:25:43