zoukankan      html  css  js  c++  java
  • CodeForces 300B Coach (并查集)

    #include<iostream>
    #include<cstdio>
    #include<cstring>
    #include<vector>
    #include<queue>
    #include<algorithm>
    using namespace std;
    int vis[50];
    int fa[50];
    int num[50];
    int find(int x)
    {
        return fa[x]==x?x:find(fa[x]);
    }
    void bincha(int x,int y)
    {
        int fx=find(x);
        int fy=find(y);
        if(fx!=fy)
        {
            fa[fx]=fa[fy];
            num[fy]+=num[fx];
        }
    }
    int main()
    {
        int n,m;
        int i,j,k;
        int f,t;
        int x,y;
        while(scanf("%d%d",&n,&m)!=EOF)
        {
           memset(vis,0,sizeof(vis));
           int ok=1;
           for(i=0;i<=n;i++)
           {
               fa[i]=i;
               num[i]=1;
           }
           while(m--)
           {
               scanf("%d%d",&x,&y);
               vis[x]=vis[y]=2;
               bincha(x,y);
           }
           for(i=1;i<=n;i++)
           {
              int fi=find(i);
              if(num[fi]>3)
              {
                  ok=0;
                  break;
              }
           }
           if(ok==0)
           {
               printf("-1
    ");
               continue;
           }
    
           for(i=1;i<=n;i++)
           {
               if(find(i)==i&&vis[i]==2)
               {
                   //printf("%d %d....
    ",i,vis[i]);
                   printf("%d",i);
                   int coun=0;
                   for(j=1;j<=n;j++)
                   {
                       if(find(j)==i&&j!=i)
                       {
                           printf(" %d",j);
                           coun++;
                       }
                   }
                   //printf(" 
    ......%d %d
    ",i,coun);
                   if(coun==1)
                   {
                   for(j=1;j<=n;j++)
                   {
                       if(vis[j]==0)
                       {
                           vis[j]=1;
                           printf(" %d",j);
                           break;
                       }
                   }
               }
               printf("
    ");
               }
           }
          // printf("dddddddddddd
    ");
           int cnt=0;
           for(i=1;i<=n;i++)
           {
               if(vis[i]==0)
               {
                   printf("%d",i);
                   cnt++;
                   if(cnt%3==0) printf("
    ");
                   else printf(" ");
               }
           }
        }
        return 0;
    }
    
  • 相关阅读:
    HDU 2001 计算亮点间的距离
    HDU 1003 Max Sum
    HDU 2091 空心三角形
    HDU 2021 发工资咯:)
    HDU 2028Lowest Common Multiple Plus
    asp.net面试题
    BSD socket
    循环添加textbox的数据
    总结一下网站注入与防范的方法
    net生成12位随机数
  • 原文地址:https://www.cnblogs.com/sola1994/p/4725959.html
Copyright © 2011-2022 走看看