这个 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. scratch少儿编程第一季——05、移动还可以这样动

    各位小伙伴大家好: 上期我们学习了怎么控制方向和移动的程序块. 今天我们继续学习运动模块下的其他9个指令(程序块). 首先来看前面两个关于x坐标的程序块. 分别是将x坐标增加()单位,和将x坐标设定为 ...

  2. msyql 去重

    delete from userinfo where busi_id in (select busi_id from (select busi_id from userinfo group by bu ...

  3. php底层变量存储

    变量存储 php的变量使用一个结构体 zval来保存的,在Zend/zend.h中我们可以看到zval的定义 struct _zval_struct { /* Variable information ...

  4. hdu 2544 Dijstra模板题

    最短路 Time Limit: 5000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submiss ...

  5. Https的作用

    在普通的网络环境下,HTTP请求存在DNS劫持.运营商插入广告.数据被窃取,正常数据被修改等安全风险.使用HTTPS协议可以保证数据传输的安全性. Https的作用:    内容加密 建立一个信息安全 ...

  6. vscode 基本知识以及如何配置 C++ 环境

    参考: 在用VSCode? 看完这篇文章, 开发效率翻倍!最后一条厉害了~ Visual Studio Code(VS code)你们都在用吗?或许你们需要看一下这篇博文 按下 ctrl+K,再按下 ...

  7. UIApplicationDelegate里面最常用的几个函数执行顺序小结

    (1)点击桌面图标正常启动App或者杀死进程后点击推送消息启动App 1.application:willFinishLaunchingWithOptions 2.application:applic ...

  8. laravel中引入composer安装在vendor中的第三方组件

    一.安装第三方组件 方法一:使用命令行安装第三方(已phpword为例): composer require phpoffce/phpword ^v0..* 方法二: 修改主项目composer.js ...

  9. string+DFS leetcode-17.电话号码下的字母组合

    题面 Given a string containing digits from 2-9 inclusive, return all possible letter combinations that ...

  10. 《深入Linux内核架构》笔记 --- 第一章 简介和概述

    Linux将虚拟地址空间划分为两个部分,分别称为内核空间和用户空间 各个系统进程的用户空间是完全彼此分离的,而虚拟地址空间顶部的内核空间总是同样的,无论当前执行的是哪个进程. 尽管Intel处理器区分 ...