zoukankan      html  css  js  c++  java
  • poj 1679 The Unique MST

    #include<stdio.h>
    #include<string.h>
    #include<algorithm>
    using namespace std;
    struct data
    {
        int u,v,w;
        int same;
        int use;
        int del;
    }e[10000+5];
    
    int n,m,bin[1000+5],f;
    
    bool cmp(data a,data b)
    {
        return a.w<b.w;
    }
    
    int Find(int x)
    {
        int s;
        for(s=x;bin[s]>=0;s=bin[s]);
    
        while(s!=x)
        {
            int t=bin[x];
            bin[x]=s;
            x=t;
        }
        return s;
    }
    
    void Union(int x1,int x2)
    {
        int f1=Find(x1),f2=Find(x2);
        int t=bin[f1]+bin[f2];
        if(bin[f1]>bin[f2])
        {
            bin[f1]=f2;
            bin[f2]=t;
        }
        else
        {
            bin[f2]=f1;
            bin[f1]=t;
        }
    
    }
    
    int kruskal()
    {
        int i,num=0,u,v,ans=0;
        for(i=0;i<=n+5;i++)
            bin[i]=-1;
    
        for(i=0;i<m;i++)
        {
            //printf("%d
    ",i);
            if(e[i].del==1) continue;
            u=e[i].u;
            v=e[i].v;
            if(Find(u)!=Find(v))
            {
                Union(u,v);
                num++;
                ans+=e[i].w;
                if(f) e[i].use=1;
            }
            if(num>=n-1) break;
        }
        return ans;
    }
    
    int main()
    {
        int _,i,j,k,ans1,ans2;
        scanf("%d",&_);
        while(_--)
        {
            scanf("%d%d",&n,&m);
            for(i=0;i<m;i++)
            {
                scanf("%d %d %d",&e[i].u,&e[i].v,&e[i].w);
                e[i].u--;
                e[i].v--;
                e[i].use=0;
                e[i].same=0;
                e[i].del=0;
            }
    
            for(i=0;i<m;i++)
                for(j=0;j<m;j++)
            {
                if(i==j) continue;
                if(e[i].w==e[j].w)
                    e[i].same=e[j].same=1;
            }
            f=1;
            sort(e,e+m,cmp);
            ans1=kruskal();
            f=0;
            for(i=0;i<m;i++)
            {
                if(e[i].same==1&&e[i].use==1)
                {
                  e[i].del=1;
                  ans2=kruskal();
                  if(ans2==ans1)
                  {
                      printf("Not Unique!
    ");
                      break;
                  }
                  e[i].del=0;
                }
            }
    
            if(i>=m)
                printf("%d
    ",ans1);
        }
        return 0;
    }

    版权声明:本文为博主原创文章,未经博主允许不得转载。http://xiang578.top/

  • 相关阅读:
    python 复杂一点的装饰器
    python 装饰器
    python 歌词解析
    ATX 免越狱调试IOS和Android
    OpenCV库文件介绍
    NetEaseGame/ATX 的MD
    带你玩转Visual Studio——带你高效开发
    python 图像识别
    fatal: Authentication failed for又不弹出用户名和密码 解决办法
    lua luna工具库
  • 原文地址:https://www.cnblogs.com/xryz/p/4847910.html
Copyright © 2011-2022 走看看