题意:给你n,m表示有n个点编号从1到n,然后m条边;问这个图是否能形成一个三分图;
那么什么是三分图呢?我相信如果知道二分图的,三分图肯定就知道了;因为二分图是把图上的点分为两个集合1,2;并且对于集合1中任意点都要和集合2中的任意点有边相连接,并且满足对集合本身中的点之间没有边相互连接;其实三分图也是类比这个思想来的;
也就是三个集合1,2,3,问是否能构成任意两个集合之间的元素能有边相连接,并且集合自己本身中的点没有边连接;
其实这个题虽然题目给了没有自回路,但是为什么后面我明明分为三个集合了为什么还是wa呢?
后来我自己加了自回路的判断条件才过的,所以我觉得测试数据应该包含了自回路的测试数据,虽然题上说没有自回路!!!!
我先来说说我自己的思路吧:
1.首先利用邻接表建立无向图;
2.把1点设为属于集合1,同时判断是否它是和其他点相连接,如果没有和1相连接的点,那么肯定答案就是-1了;为什么呢?
因为:

这种能构成三分图吗?
显然不行;
3.任意找出一个与1点相连接的点,我假设成2点哈,因为这个取点是按照输入顺序来的;
那么这个2点肯定不会和1点是一个集合;为什么呢?
因为:

因为一个集合里面任意两点之间不能存在边相连接;
所以我把2点设为集合2;
3.找出于1点和2点相连接的 其他点我假设为3点,其实也可以是其他点,我这里方便描述就这样说了;
注意这里找的时候,需要知道与1点和2点相连接的点,肯定只能是与1点和2点相连接;
因为题给的图可能会有这四种情况:

所以很明显只能第一种才能够满足三分图;所以在for的时候需要判断是否能找出第三个点,使得第三个点同时连接1,2两个点;
4.到这一步说明前面的1,2,3集合中 都有一个点了,并且这些点是两两相连接的;现在需要做的就是去吧其他点给分别加入三个不同的集合,那么就有三种情况:
1.枚举到当前这个点的时候这个点和1,2点相连接,与3不连接,加入集合3;
2.枚举到当前这个点的时候这个点和1,3点相连接,与2不连接,加入集合2;
3.枚举到当前这个点的时候这个点和2,3点相连接,与1不连接,加入集合1;
所以费力的就完了;
最后需要知道一个只是:对于三分图的特点(我感觉好像性质!!):
比如案例这个:

有三个集合第一个集合有1个点,第二个集合有2个点,第三个集合有3个点;
那么他们构成的边数就是12+23+31这个数字必须等于题上给的m才满足题意!!!!
其实二分图也是这样算的边数吧!!!
其实这个也好理解,你可以这样理解:
比如集合2和集合3;
在集合2中是不是2对应4,5,6三个?
在集合2中是不是3对应4,5,6三个?
所以他们之间的边总数肯定等于2
3咯;
所以是很好理解吧!!
最后就是最坑的地方了;
我觉得自己构造出的集合中是没有边相连接的;
但是一直wa,最后加一个判断自回路就过了;
我觉得案例应该有自回路数据,而不是题上说的没有自回路吧;
AC代码:

#include<bits/stdc++.h>
using namespace std;
const int M=100050;
vector<int> edge[M];
int color[M];
int cnt[5];
int main(){int n,m;int a,b;scanf("%d %d",&n,&m);for(int i=0;i<m;i++){//建立无向图 scanf("%d %d",&a,&b);edge[a].push_back(b);edge[b].push_back(a);}if(edge[1].size()==0){//如果点1  没有出度,那么肯定就不能构成三分图 cout<<-1<<endl;return 0;}int first=1;//把1设为第一个集合 color[first]=1;int second=edge[first][0];//找出与第一个点相连的点 color[second]=2;//把这个与1相连的点给设为集合2中;//遍历那些点与1和2相连接 int three=0; for(int i=2;i<=n;i++){//因为第一个点 不需要自己找自己 int f1=0,f2=0;for(int j=0;j<edge[i].size();j++){//这两个for就很巧妙了;因为我当时怎么也没想到去遍历第三个点使得和1,2两个点相连接!!!!!int t=edge[i][j];if(t==first) f1=1;if(t==second) f2=1;}if(f1&&f2){three=i;color[three]=3;break;//找出一个 与1和2集合相连接的点作为集合3 }} if(!three){//如果没有找到第三个点与1,2点相连接,那么肯定就不能构成三分图了cout<<-1<<endl;return 0;}//找 1.与1 2相连接但是与3 不相连接的点   2.找与1 3 连接的但是不和2连接的点   3.找与2 3连接的点但是不和1连接的点for(int i=1;i<=n;i++){int f1=0,f2=0,f3=0;for(int j=0;j<edge[i].size();j++){int t=edge[i][j];if(t==first) f1=1;if(t==second) f2=1;if(t==three) f3=1;}if(f1+f2+f3!=2){cout<<-1<<endl;return 0;}if(f1&&f2&&!f3)color[i]=3;if(f1&&f3&&!f2)color[i]=2;if(!f1&&f2&&f3) color[i]=1;}for(int i=1;i<=n;i++)cnt[color[i]]++;//这里用来记录  每个集合有多少个点if(cnt[1]*cnt[2]+cnt[2]*cnt[3]+cnt[3]*cnt[1]!=m){//这里用来算边数cout<<-1<<endl;return 0;}for(int i=1;i<=n;i++){//这里用来检查自回路for(int j=0;j<edge[i].size();j++){if(color[i]==color[edge[i][j]]){cout<<-1<<endl;return 0;}}}for(int i=1;i<=n;i++){printf("%d%c",color[i],i==n?'\n':' ');}return 0;
}

D. Complete Tripartite(三分图+枚举)相关推荐

  1. Complete Tripartite CodeForces - 1228D(三分图染色)

    You have a simple undirected graph consisting of nn vertices and mm edges. The graph doesn't contain ...

  2. 解题报告:POJ 3281 Dining(最大流 / “三分图”建图)

    B.POJ 3281 DiningDiningDining(最大流/建图模板)[省选/NOI- ] 有 F 种食物和 D 种饮料,每种食物或饮料只能供一头牛享用,且每头牛只享用一 种食物和一种饮料.现 ...

  3. Complete Tripartite

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

  4. 《啊哈算法》第三章--枚举很暴力

     从无到有学算法(看漫画学算法)   (๑•̀ㅂ•́)و✧ 爱要坦荡荡 - 萧潇 - 单曲 - 网易云音乐 一,坑爹的奥数 枚举算法又叫穷举算法,非常的暴力,它的基本思想是"有序地去尝试每一 ...

  5. ios NSComparator 三种枚举类型

    NSComparator有3种枚举类型 NSOrderedDescending 降序,但是用他可以实现升序或者降序都没问题. NSOrderedAscending 升序,但是目前没有使用出任何效果.. ...

  6. Codeforces 1228 D. Complete Tripartite

    题意: 给了个图 让他成为题意的3分图. 3 3 3 个集合形成了一个环的关系,所以随意调换顺序是无所谓的. 然后随便让 1 1 1 个点成为第 2 2 2 集合,那么不与这个点连边的一定也属于第二集 ...

  7. Java基础学习——Java网络编程(三)自定义枚举类、枚举类的常用方法、枚举类实现接口、枚举类的实际应用

    一.什么是枚举 枚举法:一枚一枚的列举出来,列举的元素是有限的.确定的. 例如:星期(一.二.三.四.五.六.日).性别(男.女).季节(春.夏.秋.冬) 在Java中的关键字为enum 二.枚举类的 ...

  8. RTTI(三)相关函数1【转自大富翁】

    第三部分RTTI相关函数 GetTypeData 函数 GetPropInfo 函数 FindPropInfo 函数 GetPropInfos 函数 SortPropList 函数 GetPropLi ...

  9. Android JNI编程(六)——C语言函数指针、Unition联合体、枚举、Typedef别名、结构体、结构体指针...

    版权声明:本文出自阿钟的博客,转载请注明出处:http://blog.csdn.net/a_zhon/. 目录(?)[+] 一:函数指针 1.函数指针顾名思义就是定义一个指针变量指向一个函数,和一级指 ...

最新文章

  1. AHK 中循环的基本用法
  2. NVIDIA GPU持久模式是什么?(驱动程序持久性 Driver Persistence Daemon 守护程序)
  3. getplotlyoffline(‘http://cdn.plot.ly/plotly-latest.min.js‘)无法下载如何解决
  4. java 验证码透明背景_Java中的证书透明度验证
  5. Linux 技巧: 从命令行创建像素标尺
  6. linux 查找文件 locate,linux文件查找(find,locate)
  7. ubuntu 安装log4cpp
  8. android 开源fc模拟器_用 Go 撸了一个 NES/FC/红白机模拟器——GoNES
  9. Java-集合练习题
  10. 小米一键解锁system分区_小米ROOT教程|小米红米解BL锁+ROOT通用教程
  11. 联通一直显示无法连接服务器是怎么回事,联通宽带无法连接服务器1404
  12. 思维导向树6级节点_8种常见的思维导图类型
  13. 高等代数 具有度量的线性空间(第10章)5 正交空间与辛空间
  14. TouchGFX 中文字体添加(直入正题)
  15. 嵌入式开发对学历门槛要求高吗?
  16. free software
  17. 【电子器件笔记6】三极管(BJT)参数和选型
  18. 计算机显卡显示图片原理,认识显卡!浅析显卡及显卡工作原理
  19. php保存文件快捷键,word保存快捷键是ctrl加什么
  20. 茶学领域如何用的上计算机,计算机视觉图像理技术在茶学领域应用方法的研究.pdf...

热门文章

  1. 简单CSS/HTML的动画登录注册网页[拳皇]
  2. Elasticsearch之filed详细介绍
  3. PSP金手指下载及使用方法和图文教程(图文)
  4. Python中::(双冒号)的用法
  5. 泛微OA开启非标功能
  6. 乔布斯传记电影暂定名为《灵光乍现》
  7. html里h标签的三个作用,h标签是什么,如何正确使用?
  8. 一位男人写【最疼我的妻子走了】好感动
  9. 死磕前端架构之整洁架构在前端的应用实践【稀缺资源】
  10. STM32-GPIO详解