Minimum Spanning Tree-生成树唯一?

  • 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;
    }

猜你喜欢

转载自blog.csdn.net/BePosit/article/details/82055087