建补图,是两个不仇恨的骑士连边,如果有环,则可以凑成一桌和谐的打麻将

不能直接缩点,因为直接缩点求的是连通分量,点双缩点只是把环缩起来

普通缩点                                                                                               点双缩点

  

由图可知,左图中的缩法不符题意,而右图两个缩完后的点都满足题意

然后题中说必须要奇数个骑士参加会议,即找奇圈(有奇数个点的圈)

问题就转化成缩点后判断一个点是否在奇圈里,这就用到了点双的性质

点双连通分量有两个性质:1.如果该分量里有一个奇圈,那么其他所有点也必然在某个奇圈中;2.含有一个奇圈的充要条件是该分量不是二分图。

所以我们只需要缩完点之后枚举V-DCC判断是不是二分图,不是二分图就是奇圈

那么判断二分图用染色法判断即可

注意一个骑士不可以参加会议

这句话是自言自语: Lockey注意要检查变量名是否写对了

二分图定义:

  一个无向图,使得顶点集V可以分割为两个互不相交的子集A,B,使得所有边两端分别属于两个子集A,B

度娘解释

  二分图是这样一个图: 有两顶点集且图中每条边的的两个顶点分别位于两个顶点集中,每个顶点集中没有边直接相连接!
  无向图G为二分图的充分必要条件是,G至少有两个顶点,且其所有回路的长度均为偶数。
  判断二分图的常见方法是染色法: 开始对任意一未染色的顶点染色,之后判断其相邻的顶点中,若未染色则将其染上和相邻顶点不同的颜色, 若已经染色且颜色和相邻顶点的颜 色相同则说明不是二分图,若颜色不同则继续判断,bfs和dfs可以搞定!
  易知:任何无回路的的图均是二分图
  

#include<iostream>
#include<cstdio>
#include<vector>
#include<cstring>
using namespace std;
int n,m,a[][],dfn[],low[],st[],ins[],num,v[],cnt,sp[],ok[],flag[],root;
vector<int>son[],spn[];
void tarjan(int x,int pre){
dfn[x]=low[x]=++num;
if(x==root&&son[x].size()==) spn[++cnt].push_back(x);
st[++st[]]=x;
ins[x]=;
for(int i=;i<son[x].size();i++){
int y=son[x][i];
if(y==pre) continue;
if(!dfn[y]){
tarjan(y,x);
low[x]=min(low[x],low[y]);
if(low[y]>=dfn[x]){
cnt++;
int w;
do{
w=st[st[]--];
ins[w]=;
spn[cnt].push_back(w);
}while(w!=y);
spn[cnt].push_back(x);
}
}
else low[x]=min(low[x],dfn[y]);
}
}
int dfs(int x,int pre,int loc){//是二分图返回0,是奇圈返回1
v[x]=v[pre]^;
//cout<<x<<" "<<v[x]<<endl;
for(int i=;i<son[x].size();i++){
int y=son[x][i];
//cout<<y<<" "<<" "<<flag[y]<<" "<<v[y]<<endl;
if(!flag[y]||y==pre) continue;
if(v[y]==-){
if(dfs(y,x,loc)) return ;
}
else if(v[y]==v[x]) return ;
}
return ;
} int main(){
scanf("%d%d",&n,&m);
while(n!=||m!=){
int x,y;
for(int i=;i<=m;i++){
scanf("%d%d",&x,&y);
a[x][y]=a[y][x]=;
}
for(int i=;i<=n;i++){
for(int j=;j<=n;j++){
if(a[i][j]||i==j) continue;
son[i].push_back(j);
}
}
for(int i=;i<=n;i++){
if(!dfn[i]) root=i,tarjan(i,);
}
memset(v,-,sizeof(v));
v[]=;
//cout<<cnt<<endl;
for(int i=;i<=cnt;i++){
if(spn[i].size()==) continue;
for(int j=;j<spn[i].size();j++) flag[spn[i][j]]=;
if(dfs(spn[i][],,i))
for(int j=;j<spn[i].size();j++)
ok[spn[i][j]]=;
for(int j=;j<spn[i].size();j++) flag[spn[i][j]]=,v[spn[i][j]]=-;
}
int ans=;
for(int i=;i<=n;i++) ans+=ok[i];
printf("%d\n",n-ans);
for(int i=;i<=n;i++){
dfn[i]=low[i]=;
st[i]=;
ins[i]=;
ok[i]=;
sp[i]=;
son[i].clear();
spn[i].clear();
}
st[]=;
memset(v,-,sizeof(v));
memset(a,,sizeof(a));
num=cnt=;
scanf("%d%d",&n,&m);
} }

[POJ2942]Knights of the Round Table(点双+二分图判定——染色法)的更多相关文章

  1. poj2942 Knights of the Round Table[点双+二分图染色]

    首先转化条件,把无仇恨的人连边,然后转化成了求有哪些点不在任何一个奇环中. 一个奇环肯定是一个点双,所以想到处理出所有点双,但是也可能有的点双是一个偶环,有的可能是偶环和奇环混杂,不好判. 考察奇环性 ...

  2. 【POJ 2942】Knights of the Round Table(双联通分量+染色判奇环)

    [POJ 2942]Knights of the Round Table(双联通分量+染色判奇环) Time Limit: 7000MS   Memory Limit: 65536K Total Su ...

  3. POJ2942 Knights of the Round Table[点双连通分量|二分图染色|补图]

    Knights of the Round Table Time Limit: 7000MS   Memory Limit: 65536K Total Submissions: 12439   Acce ...

  4. POJ2942 Knights of the Round Table 点双连通分量 二分图判定

    题目大意 有N个骑士,给出某些骑士之间的仇恨关系,每次开会时会选一些骑士开,骑士们会围坐在一个圆桌旁.一次会议能够顺利举行,要满足两个条件:1.任意相互憎恨的两个骑士不能相邻.2.开会人数为大于2的奇 ...

  5. [POJ2942]:Knights of the Round Table(塔尖+二分图染色法)

    题目传送门 题目描述 亚瑟王要在圆桌上召开骑士会议,为了不引发骑士之间的冲突,并且能够让会议的议题有令人满意的结果,每次开会前都必须对出席会议的骑士有如下要求: .相互憎恨的两个骑士不能坐在直接相邻的 ...

  6. POJ2942 Knights of the Round Table 点双连通分量,逆图,奇圈

    题目链接: poj2942 题意: 有n个人,能够开多场圆桌会议 这n个人中,有m对人有仇视的关系,相互仇视的两人坐在相邻的位置 且每场圆桌会议的人数仅仅能为奇书 问有多少人不能參加 解题思路: 首先 ...

  7. 【POJ】2942 Knights of the Round Table(双连通分量)

    http://poj.org/problem?id=2942 各种逗.... 翻译白书上有:看了白书和网上的标程,学习了..orz. 双连通分量就是先找出割点,然后用个栈在找出割点前维护子树,最后如果 ...

  8. 「题解」:[POJ2942]Knights of the Round Table

    问题 E: Knights of the Round Table 时间限制: 1 Sec  内存限制: 256 MB 题面 题目描述 作为一名骑士是一个非常有吸引力的职业:寻找圣杯,拯救遇难的少女,与 ...

  9. Knights of the Round Table-POJ2942(双连通分量+交叉染色)

    Knights of the Round Table Description Being a knight is a very attractive career: searching for the ...

随机推荐

  1. C# Newtonsoft.Json JObject移除属性,在序列化时忽略

    原文 C# Newtonsoft.Json JObject移除属性,在序列化时忽略 一.针对 单个 对象移除属性,序列化时忽略处理 JObject实例的 Remove() 方法,可以在 指定序列化时移 ...

  2. Win8 Metro(C#)数字图像处理--2.63图像指数增强

    原文:Win8 Metro(C#)数字图像处理--2.63图像指数增强  [函数名称]   指数增强      WriteableBitmap IndexenhanceProcess(Writea ...

  3. 基于EF6的快速开发Web框架——Swift.Net

    Swift.Net This Is A Light-Weight And Fast-Develop .Net Framework. Usage STEP 1 Create Your Entities ...

  4. C#读取数据库内容并转换成xml文件

    OleDbConnection conn = new OleDbConnection(@"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=D:\bi ...

  5. 关于VS编译DevExpress默认产生几个多余的语言包的问题解决

    原文 关于VS编译DevExpress默认产生几个多余的语言包的问题解决 VS15开始对于非系统的Dll都会默认复制到本地,即bin\debug下面,复制dll到本地好处在于发布的时候不用再去寻找相关 ...

  6. 网站运行编译器错误CS1617: 选项“6”对 /langversion 无效;必须是 ISO-1、ISO-2、3、4、5 或 Default

    运行winform程序时提示, CS1617: 选项“6”对 /langversion 无效:必须是 ISO-1.ISO-2.3.4.5 或 Default 找到网站的web.config配置文件,找 ...

  7. 修改用户名后TSF出现"需要本地工作区。工作区 xxx 并未驻留在本计算机上"

    解决方法就是:1,打开vs下的"开发人员命令提示"2,按下面格式输入命令:tf workspaces /collection:http://192.168.0.110:8080/t ...

  8. 腾讯移动Web整体解决方案Spirit

    Spirit(勇气号),美国航天局NASA派往Mars(火星)的第一艘探测器.移动Web开发是一块新的领域,甚至有很多坑,这一点与人类从未踏上的Mars(火星)相似.为了避免开发者重复遇到相同的问题, ...

  9. 解决SpringBoot多模块发布时99%的问题?SpringBoot发布的8个原则和4个问题的解决方案

    如果使用 SpringBoot 多模块发布到外部 Tomcat,可能会遇到各种各样的问题.本文归纳了以下 8 个原则和发布时经常出现的 4 个问题的解决方案,掌握了这些原则和解决方案,几乎可以解决绝大 ...

  10. vista下开机启动 简单绕过UAC的方法(自己使用runas参数重新启动自己,有点意思)

    背景      vista下,如果不开启UAC,那就没有我下面要说的问题了,呵呵.下面说的都是在vista开启UAC的前提下说的,win7也适用.      在vista下,系统开启了UAC,如果你的 ...