poj 1679 The Unique MST

    技术2022-05-20  57

    #include <iostream> #include <algorithm> using namespace std; int n,m,parent[600]; bool flag[260000]; struct node { int x,y,w; }tree[260000]; int cmp(node aa,node bb) { return aa.w<bb.w; } void makeset() { int x; for(x=1;x<=n;x++) parent[x]=x; } int findset(int x) { if(x!=parent[x]) parent[x]=findset(parent[x]); return parent[x]; } void unionset(int x,int y) { x=findset(x); y=findset(y); if(parent[x]==parent[y]) return ; parent[y]=x; } int kruskal() { int i,j,cnt=0,res=0; sort(tree,tree+m,cmp); makeset(); for(i=0;i<m;i++) { if(findset(tree[i].x)!=findset(tree[i].y)) { cnt++; unionset(tree[i].x,tree[i].y); flag[i]=1; res+=tree[i].w; } if(cnt==n-1) break; } if(cnt==n-1) return res; else return -1; } int sec_kruskal() { int i,j,cnt=0,res=0,minc=99999999,fg=0,flg=0; for(i=0;i<m;i++) { if(flag[i]) { makeset(); flg=0; cnt=0; res=0; for(j=0;j<m;j++) { if(j!=i && findset(tree[j].x)!=findset(tree[j].y)) { cnt++; unionset(tree[j].x,tree[j].y); res+=tree[j].w; } if(cnt==n-1) { fg=1; flg=1; break; } } if(minc>res && flg) minc=res; } } if(fg) return minc; else return -1; } int main() { int i,j,minc=999999999,t; scanf("%d",&t); while(t--) { scanf("%d%d",&n,&m); for(i=0;i<m;i++) scanf("%d%d%d",&tree[i].x,&tree[i].y,&tree[i].w); if(kruskal()==sec_kruskal()) printf("Not Unique!/n"); else printf("%d/n",kruskal()); } return 0; } /*

    简单次小生成树 如果次小生成树与最小生成树权值相等 则返回“Not Unique”

    做法:两次kruskal

    做次小生成树用kruskal比prim容易实现

    */


    最新回复(0)