题目链接:

poj2942

题意:

有n个人,能够开多场圆桌会议

这n个人中,有m对人有仇视的关系,相互仇视的两人坐在相邻的位置

且每场圆桌会议的人数仅仅能为奇书

问有多少人不能參加

解题思路:

首先构图,将全部的仇视关系视为一条边,最后再取已经得到的图的逆图,

这样图上连接的边就代表能够相邻而坐的关系

然后就是找奇圈了,首先就是要找图中的环(点双连通分量)

这个环为奇环的条件:不是二分图||这个环中的部分点属于其它奇环

这个推断能够通过将已找到的环进行dfs黑白染色推断

最后不在奇环内的总和即是答案

至于为什么要找的是点双连通分量而不是边双连通分量 能够试试这组数据:

6 8
1 4
1 5
1 6
2 4
2 5
2 6
3 6
4 5
0 0

得到的逆图是这种:

假设是电双连通分量(拆开割点)则分为(1 2 3)和(3 4 5 6)两部分

而假设是边双连通分量(去掉割边)则仅仅有(1 2 3 4  5 6 )一部分了

代码:

#include<iostream>
#include<cstdio>
#include<cstring>
#define maxn 1050
using namespace std;
struct node{int to,next;
}edge[2000500];
int head[maxn],ss;
int map[maxn][maxn];int in[maxn],odd[maxn],temp[maxn];
int color[maxn];int dfn[maxn],low[maxn],num;
int insta[maxn],sta[maxn],top;
int n;void init()
{memset(dfn,0,sizeof(dfn));memset(head,-1,sizeof(head));memset(insta,0,sizeof(insta));memset(map,0,sizeof(map));memset(odd,0,sizeof(odd));top=num=ss=0;
}void addedge(int a,int b)
{edge[ss]=(node){b,head[a]};head[a]=ss++;
}int dfs(int u,int c)
{color[u]=c;for(int i=head[u];i!=-1;i=edge[i].next){int v=edge[i].to;if(!in[v])continue;if(color[v]==c)return 1;else if(color[v])continue;else if(dfs(v,3-c))return 1;}return 0;
}void Tarjan(int u,int pre)
{dfn[u]=low[u]=++num;insta[u]=1;sta[top++]=u;for(int i=head[u];i!=-1;i=edge[i].next){int v=edge[i].to;if(v==pre)continue;if(!dfn[v]){Tarjan(v,u);low[u]=min(low[u],low[v]);if(dfn[u]<=low[v]){int s=0,d=-1;memset(in,0,sizeof(in));while(d!=v)         //注意是v   点双连通的还有一种写法,总之要注意割点能够属于多个连通分量{d=sta[--top];in[d]=1;insta[d]=0;       //不能让u=0temp[s++]=d;}in[u]=1;memset(color,0,sizeof(color));if(dfs(u,1))          //黑白染色判定{odd[u]=1;while(s!=0)odd[temp[--s]]=1;}}}else if(insta[v])low[u]=min(low[u],dfn[v]);}
}void solve()
{for(int i=1;i<=n;i++)if(!dfn[i])Tarjan(i,-1);int ans=0;for(int i=1;i<=n;i++)if(!odd[i])ans++;printf("%d\n",ans);
}int main()
{
//    freopen("in.txt","r",stdin);int m,a,b;while(scanf("%d%d",&n,&m)&&(m+n)){init();while(m--){scanf("%d%d",&a,&b);map[a][b]=map[b][a]=1;}for(int i=1;i<=n;i++)for(int j=1;j<=n;j++)if(i!=j&&!map[i][j])   //取逆图addedge(i,j);solve();}return 0;
}

POJ2942 Knights of the Round Table 点双连通分量,逆图,奇圈相关推荐

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

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

  2. UVA1364 Knights of the Round Table(双连通分量、二分图染色,超详细解释)

    整理的算法模板合集: ACM模板 UVA1364 Knights of the Round Table 题目中要求互相有憎恨关系的人不能坐在相邻的位置,一个圆桌可以很形象地看作是一个环,也就是说我们两 ...

  3. Uvalive 3523 - Knights of the Round Table (双连通分量+二分图)

    题目链接 https://vjudge.net/problem/UVALive-3523 [题意] 有n个骑士经常举行圆桌会议,每次圆桌会议应至少有3个人参加且人数必须是奇数,相互憎恨的骑士不能坐在圆 ...

  4. POJ 2942 Knights of the Round Table ★(点双连通分量+二分图判定)

    题意:找出图中不可能在奇圈中的点. [分析]注意到,在不同点双连通分量中的两个点,显然是不会存在圈的.那么这样,问题就划归为在点双连通分量中去找奇圈. [重要性质]在一个点双连通分量中,只要有任意一个 ...

  5. POJ - 2942 Knights of the Round Table(点双缩点+二分图判定)

    题目链接:点击查看 题目大意:国王要在圆桌上召开骑士会议,但是有若干对骑士之间互相憎恨.出于各种各样奇怪的原因,每次开会都必须有以下要求: 相互憎恨的两个骑士不能坐在相邻的两个位置 为了让投票表决议题 ...

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

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

  7. poj2942点双连通奇圈-二分图判断Knights of the Round Table

    题意:在亚瑟王的圆桌骑士团中,某些骑士两两之间相互憎恨,这样一来他们开会的时候边不能相邻的坐着.即肯定存在某些人不能参加会议.假如一个骑士所有的会议都不能出席,那么他就会被驱逐.现在已知那些骑士之间相 ...

  8. 【POJ 2942】Knights of the Round Table(点双连通分量,二分图染色)

    圆桌会议必须满足:奇数个人参与,相邻的不能是敌人(敌人关系是无向边). 求无论如何都不能参加会议的骑士个数.只需求哪些骑士是可以参加的. 我们求原图的补图:只要不是敌人的两个人就连边. 在补图的一个奇 ...

  9. poj 2942 Knights of the Round Table(双连通分量+tarjan+二分图判定)

    http://poj.org/problem?id=2942 题意: 有N个骑士,给出某些骑士之间的仇恨关系,骑士们开会时会围坐在一个圆桌旁.一次会议能够顺利举行,要满足两个条件: 1:任意相互憎恨的 ...

最新文章

  1. 理解委托(delegate)及为什么要使用委托
  2. Ember.js系列文章
  3. 直播报名 | 官方解读NVIDIA黑科技:StyleGAN的架构与实现
  4. 前端构建工具的用法—grunt、gulp、browserify、webpack
  5. 移动端点击延迟300ms传说 你听过吗
  6. 【重难点】【JUC 03】怎么实现一个线程安全的队列、手写模拟实现一个阻塞队列
  7. 爱了爱了!阿米洛熊猫VA108机械键盘cherry樱桃粉轴白灯,写代码神器!免费包邮送到家!...
  8. 利用python的pyqt5和vtk库实现对gcode模型的全彩预览
  9. 计算机记笔记软件是什么,电脑记笔记软件哪个好(适合学生做笔记的软件)
  10. 视频传输协议的总结区分
  11. python3 软件加密狗_给软件制作加密狗 - virbox加密空间站 - OSCHINA - 中文开源技术交流社区...
  12. python微博视频爬取
  13. 计算机桌面背景显示方式有几种,win7更改自己电脑的桌面背景几种方法介绍 Windows7系统更改桌面背景的方法图文教...
  14. Python超详细学员管理系统【面向对象实现】
  15. 用数字计算机公式表白,用最浪漫的数学表白,爱情数学表白公式
  16. Unity ECS 简介
  17. jQuery - 实例- 小小动画导航栏
  18. 搭建自己的NAS 系统
  19. 中国天眼新发现登Nature封面:恒星形成速度比我们想象快10倍
  20. 调停者模式(Mediator) Java实现

热门文章

  1. Object Detection: Face Detection using Haar Cascades
  2. 百度贴吧高考作文强贴
  3. [转] React风格的企业前端技术
  4. 除了汪峰,还有哪些明星跨界做智能硬件
  5. 转账给张三,钱却被李四收到,如何狙击凶险的 App 漏洞?——专访娜迦CTO玩命...
  6. 招聘启事的正确阅读方式您知多少?
  7. CentOS6.6上编译安装httpd2.4
  8. PHP操作Memcache实例介绍
  9. 09-Windows Server 2012 R2 会话远程桌面-标准部署-使用PowerShell进行部署2-2
  10. Oracle技术之O7_DICTIONARY_ACCESSIBILITY(二)