zoukankan      html  css  js  c++  java
  • C. Graph and String

    二分图染色

    b点跟除自身外所有的点连接,共n-1个,首先把连接n-1个的点全部设为b点,其它点任意一点设为a,与a相连的都是a点,剩余为c点。最后验证是否成立。

    验证条件为,所有连接的点之间的差值的绝对值不超过1,未连接的点之间的差值的绝对值都大于1.

     1 #include<bits/stdc++.h>
     2 #include<stdlib.h>
     3 #include<math.h>
     4 using namespace std;
     5 int mp[520][520];
     6 int cnt[520];
     7 int flag[520];
     8 int n,m;
     9 int main()
    10 {
    11     scanf("%d%d",&n,&m);
    12 
    13     for(int i=1;i<=m;i++)
    14     {
    15         int x,y;
    16         scanf("%d%d",&x,&y);
    17         mp[x][y]=mp[y][x]=1;
    18         cnt[x]++;
    19         cnt[y]++;
    20     }
    21     for(int i=1;i<=n;i++)
    22     {
    23         if(cnt[i]==n-1)
    24             flag[i]=2;
    25 
    26     }
    27     int now=0;
    28     for(int i=1;i<=n;i++)
    29     {
    30         if(flag[i]!=2)
    31         {
    32             now=i;
    33             break;
    34         }
    35     }
    36         if(now==0)
    37         {
    38             printf("Yes
    ");
    39             for(int i=1;i<=n;i++)
    40                 printf("b");
    41             return 0;
    42         }
    43 
    44         flag[now]=1;
    45         for(int i=1;i<=n;i++)
    46         {
    47             if(now==i) continue;
    48            // if(mp[i][now])
    49             if(!mp[i][now]) flag[i]=3;
    50             else if(flag[i]==0) flag[i]=1;
    51         }
    52         for(int i=1;i<=n;i++)
    53         {
    54             for(int j=1;j<=n;j++)
    55             {
    56                 if(i==j) continue;
    57                 if(mp[i][j])
    58                 {
    59                     if(abs(flag[i]-flag[j])>1)
    60                         return puts("No");
    61                 }
    62                 else
    63                 {
    64                     if(abs(flag[i]-flag[j])<=1)
    65                         return puts("No");
    66                 }
    67             }
    68         }
    69         printf("Yes
    ");
    70         for(int i=1;i<=n;i++)
    71         {
    72             if(flag[i]==1) cout<<'a';
    73             else if(flag[i]==2) cout<<'b';
    74             else cout<<'c';
    75         }
    76         return 0;
    77 
    78 }
  • 相关阅读:
    CSS实现底部固定
    ES6新特性--多行文本
    DataTable转实体
    jQuery插件开发
    页面可编辑
    clearfix--清除浮动
    前端日历控件推荐
    图片Base64编码
    第八周学习进度博客
    人月神话多后感01
  • 原文地址:https://www.cnblogs.com/superxuezhazha/p/5187446.html
Copyright © 2011-2022 走看看