Link

题目大意:给定一个无向图,将它划分为三个点集,要求在一个点集中的点没有边相连,且颜色相同,不同集合中的点互相有边相连。

\(\text{Solution:}\)

我们发现,与一个点之间没有边相连的一定在同一个集合。

因为如果有边相连就已经违反了一个性质。

那么我们可以轻易确定一个集合。剩下的任务就是在剩下的点中确定另外两个集合。

我们遍历剩下没有确定的所有集合,随意找到一个点,将所有与它相连的、未染色的点划分为一个集合。

这样,剩下的点就是另一个集合。

证明:

对于除去已经确定的集合中的点,随意找到的点,它所相连的边,一种是属于已经确定的集合,就是已经染色的,直接跳过;

否则,其它边所连的点一定与它自己在不同集合中。而且,对于一个合法的划分,这是对所有点都满足的性质。

于是,我们随机找的正确性就有了保障。

并且还能证明出这样划分的集合形态唯一:对于一个点所连的所有点,因为我们选择先确定第一个集合,那么显然一个集合的点是确定的。因为与一个点没有边相连的点是确定的。

进一步地,因为我们已经证明随机选点的正确性,那我们随便选一个点,最终造成的结局一定是合法的(如果这个图有解)。因为对于任意个点都满足那个性质。

所以,我们随机选一个点并染色后,只需要一次判断就行了。

证毕。

首先判断每个集合中的点数是不是\(0\),无解情况之一。其次,枚举每个点对应的每条边,看看所连的点对应的集合是不是满足连满了对应的所有点。以及判断有没有与它相连的同一集合的点。

这题做完了。复杂度\(O(\text{min(n,m)})\)的亚子。

#include<bits/stdc++.h>
using namespace std;
const int MAXN=3e5+10;
int n,m,tot,head[MAXN<<1];
int col[MAXN],c[MAXN],cl[MAXN][4];
struct edge {
int nxt,to;
} e[MAXN<<1];
inline void add(int x,int y) {
e[++tot].to=y;
e[tot].nxt=head[x];
head[x]=tot;
} int main() {
scanf("%d%d",&n,&m);
for(int i=1; i<=m; ++i) {
int x,y;
scanf("%d%d",&x,&y);
add(x,y);
add(y,x);
}
col[1]=1;
c[1]++;
for(int i=head[1]; i; i=e[i].nxt) {
int j=e[i].to;
col[j]=2;
}
for(int i=1; i<=n; ++i)if(!col[i])col[i]=1,c[1]++;
int s=2;
for(; s<=n&&col[s]!=2; s++);
for(int i=head[s]; i; i=e[i].nxt) {
int j=e[i].to;
if(col[j]==1)continue;
col[j]=3;
c[3]++;
}
c[2]=n-c[1]-c[3];
if(!c[1]||!c[2]||!c[3])return 0&puts("-1");
for(int x=1; x<=n; ++x) {
for(int i=head[x]; i; i=e[i].nxt) {
int j=e[i].to;
cl[x][col[j]]++;
}
for(int i=1; i<=3; ++i) {
if(col[x]!=i&&cl[x][i]!=c[i]) {
puts("-1");
return 0;
}
if(col[x]==i&&cl[x][i])return 0&puts("-1");
}
}
for(int i=1; i<=n; ++i)cout<<col[i]<<" ";
return 0;
}

【题解】CF1228D Complete Tripartite的更多相关文章

  1. CF1228D Complete Tripartite

    思路: 任选一点a,和a没有边直接相连的点一定和a在同一个集合,由此构造得到一个集合A.用类似的方法再构造一个集合B,并将剩下的点放在集合C中,就得到了三个集合A,B,C.再检查A,B,C是否符合要求 ...

  2. Complete Tripartite

    D - Complete Tripartite 思路:这个题是个染色问题.理解题意就差不多写出来一半了.开始的时候还想用离散化来储存每个点的状态,即它连接的点有哪些,但很无奈,点太多了,long lo ...

  3. 【Codeforces Round #589 (Div. 2) D】Complete Tripartite

    [链接] 我是链接,点我呀:) [题意] 题意 [题解] 其实这道题感觉有点狗. 思路大概是这样 先让所有的点都在1集合中. 然后随便选一个点x,访问它的出度y 显然tag[y]=2 因为和他相连了嘛 ...

  4. PAT甲题题解-1064. Complete Binary Search Tree (30)-中序和层次遍历,水

    由于是满二叉树,用数组既可以表示父节点是i,则左孩子是2*i,右孩子是2*i+1另外根据二分搜索树的性质,中序遍历恰好是从小到大排序因此先中序遍历填充节点对应的值,然后再层次遍历输出即可. 又是一道遍 ...

  5. PAT甲题题解-1110. Complete Binary Tree (25)-(判断是否为完全二叉树)

    题意:判断一个节点为n的二叉树是否为完全二叉树.Yes输出完全二叉树的最后一个节点,No输出根节点. 建树,然后分别将该树与节点树为n的二叉树相比较,统计对应的节点个数,如果为n,则为完全二叉树,否则 ...

  6. CF #589 (Div. 2) D. Complete Tripartite 构造

    这个 D 还是十分友好的~ 你发现这 $3$ 个集合形成了一个环的关系,所以随意调换顺序是无所谓的. 然后随便让 $1$ 个点成为第 $2$ 集合,那么不与这个点连边的一定也属于第二集合. 然后再随便 ...

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

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

  8. Codeforces 1228D. Complete Tripartite

    传送门 不妨设 $1$ 号点在集合 $1$ 里 那么对于其他点,有且只有所有和 $1$ 没有边的点都在集合 $1$ 里 考虑不在集合 $1$ 的任意一个点 $x$ ,不妨设它在集合 $2$ 里 那么所 ...

  9. cf1228 D Complete Tripartite(哈希)

    题意: 无向简单图,无自环,无重边,n个点,m条边,请你将这n个点分为3个互相没有交集的集合.并且满足以下条件: 1.同一个集合中的任意两点之间没有边. 2.每个点都要与除了它这个集合以外的所有点相连 ...

随机推荐

  1. iOS 报错: linker command failed with exit code 1 (use -v to see invocation) 原因

    在iOS开发中,很多人会遇到这样的报错 linker command failed with exit code 1 (use -v to see invocation) 可能的原因如下: 1.引用出 ...

  2. 只有一重循环的排序——侏儒排序(Gnome Sort)

    侏儒排序:从头(i=0)开始遍历元素,如果当前元素比前一个元素大(array[i]>array[i-1]),就把它跟前一个元素互换(Swap(a[i],a[i-1]))并继续检查它(i--),否 ...

  3. 【C#】Random类中构造方法、时间种子与随机数序列的关系

    Random类 构造函数 1) Random random = new Random(); // 无参数构造函数使用系统时钟生成其种子值 然而,系统时钟取值范围有限,因此在小规模计算中,可能无法使用不 ...

  4. 微服务架构组件梳理之Netflix停更之后该何去何从

    自2018年底,Netflix陆续宣布Eureka.Hystrix等框架进入维护状态,不再进行新功能的开发. 恰逢最近我打算对公司的办公项目进行微服务架构升级,所以恶补了一番微服务相关知识,在这里进行 ...

  5. IDEA编写JavaWeb出现乱码,成功解决!

    使用IDEA写JavaWeb项目时,总会出现编码出错等问题,比如下面这样,页面显示出来一大堆乱码,下面跟着我来操作一下,可以成功解决! 首先在IDEA安装目录下有一个:bin的文件夹,打开后找到如下两 ...

  6. 购书网站前端实现(HTML+CSS+JavaScript)

    购书+阅读静态网页设计与实现 一.主页设计HTML 1.效果展示及实现 2.完整代码 二.主页样式布局CSS 三.空间功能实现Javascript 主要功能 Javascript完整代码: 总结 购书 ...

  7. 关于json序列化相关代码

    自己写的一个 /// <summary> /// 序列化JSON,返回string /// </summary> /// <param name="dt&quo ...

  8. 蓝奏网盘CMD控制台

    LanZouCloud-CMD 2.0 基于蓝奏云API开发的CMD版蓝奏云控制台 Github : https://github.com/zaxtyson/LanZouCloud-CMD 更新说明 ...

  9. Solr专题(三)SSM项目整合Solr

    一.环境配置 所需要的jar包: org.apache.solr.solr-solrj maven依赖: <!-- https://mvnrepository.com/artifact/org. ...

  10. linux 多进程

    Linux下的多进程编程初步 Linux下的多进程编程初步 多进程编程 1 Linux下进程的结构 2 Linux下的进程控制 21 僵尸进程 22 fork 23 exec 函数族 3 Linux下 ...