-
K - The Unique MST
- POJ - 1679
- 标记最小生成树的每一条边然后依次去delete 判断能否还能构成最小生成树
- 注意 标记使用时 只需要第一次标记否会对后面产生影响。
-
#include<iostream> #include<cstring> #include<algorithm> #include<vector> #include<cmath> using namespace std; #define maxn 155 int fa[maxn],n,m,t,u,v,w,ans; bool flag=1,cflag=1; struct node { int u,v,w; bool del,used,equ;//是否删除,是否使用过,有没有相同的边 . } edge[maxn*100]; bool cmp(node a,node b) { return a.w<b.w; } int fond(int x) { return x==fa[x]?x:fa[x]=fond(fa[x]); } int kruskal() { int sum=0; int k=n; for(int i=1; i<=n; i++) fa[i]=i; sort(edge,edge+m,cmp); for(int i=0; i<m&&k>1; i++) { if(edge[i].del==1) continue; int u=edge[i].u; int v=edge[i].v; int w=edge[i].w; if(fond(u)!=fond(v)) { fa[fond(u)]=fond(v); sum+=w; if(cflag) edge[i].used=1; k--; } } if(k>1) return -1; else return sum; } int main() { cin>>t; while(t--) { flag=1; cflag=1; cin>>n>>m; for(int i=0; i<m; i++) { cin>>u>>v>>w; edge[i].u=u; edge[i].v=v; edge[i].w=w; edge[i].del=edge[i].used=0; } ans=kruskal(); cflag=0; for(int i=0; i<m; i++) { if(edge[i].used==1&&edge[i].w!=0) { edge[i].del=1; int tans=kruskal(); if(tans==ans) { cout<<"Not Unique!"<<endl; flag=0; break; } else edge[i].del=0; } } if(flag) cout<<ans<<endl; } return 0; }
Minimum Spanning Tree-生成树唯一?
最新推荐文章于 2023-05-28 17:59:43 发布