这个 D 还是十分友好的~

你发现这 $3$ 个集合形成了一个环的关系,所以随意调换顺序是无所谓的.

然后随便让 $1$ 个点成为第 $2$ 集合,那么不与这个点连边的一定也属于第二集合.

然后再随便找一个与所选点有连边的点,将这个设为第 $3$ 集合中的点,然后与这个点有连边且不为第二集合的就是第一集合的.

构造出了 $3$ 个集合后再判断一下是否不合法即可.

几个判断方式:

1. 一个集合中不能有连边

2. 任意一个集合中所有点出边的数量应该相同.

3. 任何一个点集都不能为空.

#include <bits/stdc++.h>
#define N 100004
#define setIO(s) freopen(s".in","r",stdin)
using namespace std;
vector<int>G[N];
int vised[N],ty[N],cnt[N];
int main()
{
// setIO("input");
int n,m,i,j,flag=0;
scanf("%d%d",&n,&m);
for(i=1;i<=m;++i)
{
int a,b;
scanf("%d%d",&a,&b);
G[a].push_back(b);
G[b].push_back(a);
}
ty[1]=2;
cnt[2]=1;
for(i=0;i<G[1].size();++i)
{
int v=G[1][i];
vised[v]=1;
}
// 对2染色.
for(i=2;i<=n;++i) if(!vised[i]) ty[i]=2, ++cnt[2];
// 判断 2 有没有不合法的.
/*
for(i=2;i<=n;++i)
{
if(ty[i]==2)
{
for(j=0;j<G[i].size();++j)
{
int v=G[i][j];
if(ty[v]==2) flag=1;
}
}
}
*/
// 对 3 染色.
for(i=1;i<=n;++i)
{
if(vised[i])
{
for(j=0;j<G[i].size();++j)
{
int v=G[i][j];
if(!ty[v])
{
ty[v]=1;
++cnt[1];
}
}
ty[i]=3;
++cnt[3];
break;
}
}
for(i=1;i<=n;++i) if(!ty[i]) ty[i]=3, ++cnt[3];
for(i=1;i<=n;++i)
{
if(ty[i]==1)
{
for(j=0;j<G[i].size();++j)
{
int v=G[i][j];
if(ty[v]==1) flag=1;
}
if(G[i].size()!=cnt[2]+cnt[3]) flag=1;
}
if(ty[i]==2)
{
for(j=0;j<G[i].size();++j)
{
int v=G[i][j];
if(ty[v]==2) flag=1;
}
if(G[i].size()!=cnt[1]+cnt[3]) flag=1;
}
if(ty[i]==3)
{
for(j=0;j<G[i].size();++j)
{
int v=G[i][j];
if(ty[v]==3) flag=1;
}
if(G[i].size()!=cnt[1]+cnt[2]) flag=1;
}
}
for(i=1;i<=n;++i) if(!ty[i]) flag=1;
if(!cnt[1]||!cnt[2]||!cnt[3]) flag=1;
if(flag) printf("-1\n");
else
{
for(i=1;i<=n;++i) printf("%d ",ty[i]);
}
return 0;
}

  

CF #589 (Div. 2) D. Complete Tripartite 构造的更多相关文章

  1. Codeforces Round #589 (Div. 2) D. Complete Tripartite(染色)

    链接: https://codeforces.com/contest/1228/problem/D 题意: You have a simple undirected graph consisting ...

  2. Codeforces Round #589 (Div. 2) D. Complete Tripartite(模拟)

    题意:给你n个点 和 m条边 问是否可以分成三个集合 使得任意两个集合之间的任意两个点都有边 思路:对于其中一个集合v1 我们考虑其中的点1 假设点u和1无边 那么我们可以得到 u一定和点1在一个集合 ...

  3. CF #589 (Div. 2)C. Primes and Multiplication 快速幂+质因数

    题目链接:https://www.luogu.org/problem/CF1228C 问题可以转化为:求质数 $p$ 在 $1\sim n$ 中的每个数中的次幂之和. 因为 $p$ 是一个质数,只能由 ...

  4. Codeforces Round #589 (Div. 2) (e、f没写)

    https://codeforces.com/contest/1228/problem/A A. Distinct Digits 超级简单嘻嘻,给你一个l和r然后寻找一个数,这个数要满足的条件是它的每 ...

  5. CF #376 (Div. 2) C. dfs

    1.CF #376 (Div. 2)    C. Socks       dfs 2.题意:给袜子上色,使n天左右脚袜子都同样颜色. 3.总结:一开始用链表存图,一直TLE test 6 (1)如果需 ...

  6. CF #375 (Div. 2) D. bfs

    1.CF #375 (Div. 2)  D. Lakes in Berland 2.总结:麻烦的bfs,但其实很水.. 3.题意:n*m的陆地与水泽,水泽在边界表示连通海洋.最后要剩k个湖,总要填掉多 ...

  7. CF #374 (Div. 2) D. 贪心,优先队列或set

    1.CF #374 (Div. 2)   D. Maxim and Array 2.总结:按绝对值最小贪心下去即可 3.题意:对n个数进行+x或-x的k次操作,要使操作之后的n个数乘积最小. (1)优 ...

  8. CF #374 (Div. 2) C. Journey dp

    1.CF #374 (Div. 2)    C.  Journey 2.总结:好题,这一道题,WA,MLE,TLE,RE,各种姿势都来了一遍.. 3.题意:有向无环图,找出第1个点到第n个点的一条路径 ...

  9. CF #371 (Div. 2) C、map标记

    1.CF #371 (Div. 2)   C. Sonya and Queries  map应用,也可用trie 2.总结:一开始直接用数组遍历,果断T了一发 题意:t个数,奇变1,偶变0,然后与问的 ...

随机推荐

  1. springboot项目在IDEA根据不同的开发人员读取不同的配置文件

    IDEA启动项目打开项目的配置文件,修改Program argument为--spring.profiles.active=developerName启动项目,即可 命令行方式启动项目 java -j ...

  2. harbor上传镜像

    在harbor服务器 1. 下载测试上传使用的镜像docker pull hello-world2. 打tagdocker tag docker.io/hello-world:latest 172.1 ...

  3. 设置阿里云镜像仓库并安装Docker

    echo "设置阿里云镜像仓库" mkdir /etc/yum.repos.d/bak && mv /etc/yum.repos.d/*.repo /etc/yum ...

  4. aliplay获取播放时长

    <div id="player-con" class="frequency-pic"></div> <link rel=" ...

  5. C# Entity Framework The ObjectContext instance has been disposed and can no longer be used for operations that require a connection

    The ObjectContext instance has been disposed and can no longer be used for operations that require a ...

  6. SQL Server系统函数:类型转换函数

    原文:SQL Server系统函数:类型转换函数 1.基本的转化 SELECT CAST(2008 as varchar(4)) + ' year!' SELECT CONVERT(varchar(4 ...

  7. numix Docky

    今天我们介绍这款主题适用于 Docky 启动器的 numix 主题,关于 Docky 大家已经应该很熟悉了,一款类似 Mac 底部软件停放的快捷启动码头.如图: 这款主题是 Docky 的主题,如果你 ...

  8. 创建多线程时,为何创建后需要Sleep?

    后面的线程用到了前面线程初始的结构,sleep一下只是做到了使前一个线程初始化完成后后一个线程才开始运行.但这样不严格,需要同步机制.在么多个线程都要用的数据结构不要放到子线程内部去初始化,程序启动时 ...

  9. Android中ListView的使用

    1.主要概念 ListView用于将大数据集以列表的形式展示. ListView可以看成一个容器,它有如下继承链: View <- ViewGroup <- AdapterView < ...

  10. 监控神器-普罗米修斯Prometheus的安装

    搬砖党的福音:普罗米修斯-监控神器 功能: 在业务层用作埋点系统 Prometheus支持多种语言(Go,java,python,ruby官方提供客户端,其他语言有第三方开源客户端).我们可以通过客户 ...