poj1679The Unique MST
题目链接:http://poj.org/problem?id=1679
判断最小生成树是否唯一。
先求出最小生成树权值ans,用vector记录用的边。
依次不用vector里记录的边求生成树,若权值等于ans,说明不唯一。
1 #include<iostream> 2 #include<cstring> 3 #include<vector> 4 #include<algorithm> 5 using namespace std; 6 7 int n,m; 8 struct edge 9 { 10 int u,v,w; 11 bool operator <(const edge &a) const { 12 return w<a.w; 13 } 14 }e[10010]; 15 int f[110]; 16 int ans; 17 vector<int>mst; 18 19 void init() 20 { 21 for(int i=0;i<=n;i++) 22 f[i]=i; 23 } 24 25 int gf(int x) 26 { 27 return x==f[x]?x:f[x]=gf(f[x]); 28 } 29 30 void unit(int x,int y) 31 { 32 int px=gf(x); 33 int py=gf(y); 34 f[px]=py; 35 } 36 37 void kru() 38 { 39 init(); 40 for(int i=0;i<m;i++) 41 { 42 if(gf(e[i].u)!= gf(e[i].v)) 43 { 44 mst.push_back(i); 45 ans+=e[i].w; 46 unit(e[i].u,e[i].v); 47 } 48 } 49 50 } 51 bool yesno() 52 { 53 for(int i=0;i<mst.size();i++) 54 { 55 int cost=0; 56 init(); 57 int k=0; 58 for(int j=0;j<m;j++) 59 { 60 if(mst[i]==j) continue; 61 if(gf(e[j].u)!=gf(e[j].v)) 62 { 63 cost+=e[j].w; 64 k++; 65 unit(e[j].u,e[j].v); 66 } 67 } 68 if(cost==ans&&k==n-1) return 1; 69 } 70 return 0; 71 } 72 int main() 73 { 74 int t; 75 cin>>t; 76 while(t--) 77 { 78 mst.clear(); 79 ans=0; 80 81 cin>>n>>m; 82 83 for(int i=0;i<m;i++) 84 cin>>e[i].u>>e[i].v>>e[i].w; 85 86 sort(e,e+m); 87 kru(); 88 if(yesno()) cout<<"Not Unique!\n"; 89 else cout<<ans<<endl; 90 91 } 92 }