题目大意:给你一个n个点m条无向边的图,问这个图是否能够:

1,被四染色(用四种颜色给图染色,且相邻点颜色不同)。

2,找出一个奇环,满足在原图中去掉这个奇环后每个点依然相邻。

请输出1或者2中的任意一种,如果不能就输出类似-1的东西。

数据范围:n,m≤300000

xfzIQ=-1

我们首先构造一棵生成树出来,这个生成树显然是一个二分图,二分图显然可以黑白染色。

对于原图中的非树边,我们把这些变构成一个图G,若G为二分图,显然原图就可以四染色了。

若G不是二分图,那么G中必有奇环,我们把奇环找出来输出就可以了。

智商被侮辱系列题目。

 #include<bits/stdc++.h>
#define M 300005
using namespace std; int f[M]={}; int get(int x){return f[x]==x?x:f[x]=get(f[x]);}
struct edge{int u,next;}e[M*]={}; int head[M]={},use=;
void add(int x,int y){use++;e[use].u=y;e[use].next=head[x];head[x]=use;} int col1[M]={},col2[M]={};
int n,m,noX=,noY=;
int u[M]={},v[M]={},sel[M]={}; void dfs(int x,int col){
col1[x]=col; if(col==) col=; else col=;
for(int i=head[x];i;i=e[i].next)
if(col1[e[i].u]==) dfs(e[i].u,col);
}
void dfs2(int x,int col){
col2[x]=col; if(col==) col=; else col=;
for(int i=head[x];i;i=e[i].next)
if(col2[e[i].u]==) dfs2(e[i].u,col);
else{
if(col2[e[i].u]==col2[x]){
noX=e[i].u;
noY=x;
//return;
}
}
} int ans[M]={},cnt=;
int getans(int x,int fa){
if(x==noY){
ans[++cnt]=x;
return ;
}
for(int i=head[x];i;i=e[i].next) if(e[i].u!=fa){
if(getans(e[i].u,x)){
ans[++cnt]=x;
return ;
}
}
return ;
} int main(){
scanf("%d%d",&n,&m);
for(int i=;i<=n;i++) f[i]=i;
for(int i=;i<=m;i++){
scanf("%d%d",u+i,v+i);
int U=get(u[i]),V=get(v[i]);
if(U==V) continue;
sel[i]=; f[U]=V;
add(u[i],v[i]); add(v[i],u[i]);
}
dfs(,);
memset(head,,sizeof(head)); use=;
for(int i=;i<=m;i++) if(sel[i]==){
add(u[i],v[i]); add(v[i],u[i]);
}
for(int i=;i<=n;i++)
if(col2[i]==) dfs2(i,); if(noX==){
printf("A ");
for(int i=;i<=n;i++)
printf("%d ",col1[i]+(col2[i]-)*);
return ;
} memset(head,,sizeof(head)); use=;
for(int i=;i<=n;i++) f[i]=i;
for(int i=;i<=m;i++) if(sel[i]==){
if(col2[u[i]]==col2[v[i]]) continue;
int U=get(u[i]),V=get(v[i]);
if(U==V) continue;
f[U]=V;
add(u[i],v[i]); add(v[i],u[i]);
if(get(noX)==get(noY)) break;
}
getans(noX,);
printf("B %d ",cnt);
for(int i=;i<=cnt;i++) printf("%d ",ans[i]);
}

【xsy3355】图 思维的更多相关文章

  1. 心智图/思维导图(Mind Map/Mind Mapping),思维导图介绍

    心智图(Mind Map),又称脑图.心智地图.脑力激荡图.思维导图.灵感触发图.概念地图.树状图.树枝图或思维地图,是一种图像式思维的工具以及一种利用图像式思考辅助工具来表达思维的工具.   心智图 ...

  2. ZOJ 1654 Place the Robots建图思维(分块思想)+二分匹配

    题目链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=654 AC一百道水题,不如AC一道难题来的舒服. 题意:一个n*m地图 ...

  3. HDU 4292 Food (建图思维 + 最大流)

    (点击此处查看原题) 题目分析 题意:某个餐馆出售f种食物,d种饮料,其中,第i种食物有fi份,第i种饮料有di份:此时有n个人来餐馆吃饭,这n个人必须有一份食物和一份饮料才会留下来吃饭,否则,他将离 ...

  4. POJ - 1149 PIGS (建图思维+最大流)

    (点击查看原题) 题目分析 (以下均为 Edelweiss 大佬的思路,博主承认自己写不了这么好,但是学习的心促使我记录下这个好题的写法,所以代码是我写的) [题目大意] 有 M 个猪圈,每个猪圈里初 ...

  5. <思维导图>思维导图

  6. 各种图(流程图,思维导图,UML,拓扑图,ER图)简介

    来源于:http://www.cnblogs.com/jiqing9006/p/3344221.html 流程图 1.定义:流程图是对过程.算法.流程的一种图像表示,在技术设计.交流及商业简报等领域有 ...

  7. 【转】各种图(流程图,思维导图,UML,拓扑图,ER图)简介

    原文地址:各种图(流程图,思维导图,UML,拓扑图,ER图)简介 流程图 1.定义:流程图是对过程.算法.流程的一种图像表示,在技术设计.交流及商业简报等领域有广泛的应用. 2.案例 3.计算机语言只 ...

  8. LeetCode刷题专栏第一篇--思维导图&时间安排

    昨天是元宵节,过完元宵节相当于这个年正式过完了.不知道大家有没有投入继续投入紧张的学习工作中.年前我想开一个Leetcode刷题专栏,于是发了一个投票想了解大家的需求征集意见.投票于2019年2月1日 ...

  9. java关键词整理——思维导图

    如图 思维导图图片链接 http://www.edrawsoft.cn/viewer/public/s/5e27f174483042

随机推荐

  1. Educational Codeforces Round 51 D. Bicolorings(dp)

    https://codeforces.com/contest/1051/problem/D 题意 一个2*n的矩阵,你可以用黑白格子去填充他,求联通块数目等于k的方案数,答案%998244353. 思 ...

  2. 清理docker大日志文件

    1.进入容器文件的存放目录 ,并查看某一个容器的文件大小 [root@auto ~]# [root@auto ~]# cd /var/lib/docker/containers [root@auto ...

  3. idea中Eclipse Code Formatter插件设置和使用,以及注释模板的修改

    在settings里面找到plugins这个选项,搜索Eclipse Code Formatter,点击安装,重启idea即可进行配置: 首先,先安装Eclipse Code Formatter插件: ...

  4. IntelliJ IDEA 2017版 SpringBoot测试类编写

    SpringBoot的测试类编写Demo 源码见 https://github.com/liushaoye/baseone.git

  5. react优化--pureComponent

    shouldComponentUpdate的默认渲染 在React Component的生命周期中,shouldComponentUpdate方法,默认返回true,也就意味着就算没有改变props或 ...

  6. Fortran编译器之一GUN Fortran安装(Windows XP)

    最近研究GIS算法,需要用到Fortran语言.在网上找了一下发现一个开源的软件GUN Fortran编译器.当然既然是编译器,就是编译出程序的,但是编辑器不包括在内.编辑器可以用Text记事本,或者 ...

  7. python-Django-01基础配置

    参考资料地址 http://www.ziqiangxuetang.com/django/django-install.html 官方文档 一: 1先下载Django源码包,下载地址https://ww ...

  8. 用 gdb 调试 GCC 程序

    Linux 包含了一个叫 gdb 的 GNU 调试程序. gdb 是一个用来调试 C 和 C++ 程序的强力调试器. 它使你能在程序运行时观察程序的内部结构和内存的使用情况. 以下是 gdb 所提供的 ...

  9. Surface 2装机必备软件指南

    新买的Surface到货了还不知道有什么用,每天就用来划划点点?有点太浪费了吧!跟哥走,哥给你推荐几款Surface 2装机必备的软件~应用商店,走起~ 初次使用看过来:Win8宝典 如果你是一个像我 ...

  10. C/C++ 打开串口和关闭串口

    通常使用下列函数来通过Win系统来对外围设备进行通信处理: 0. 前言 做串口方面的程序,使用CreateFile打开串口通信端口.在对串口操作之前,需要首先打开串口.使用C++进行串口编程,如果采用 ...