题意:一些骑士,他们有些人之间有矛盾,现在要求选出一些骑士围成一圈,圈要满足如下条件:1.人数大于1。2.总人数为奇数。3.有仇恨的骑士不能挨着坐。问有几个骑士不能和任何人形成任何的圆圈。

分析:图论综合题,涉及补图、(点)双连通分量、奇环、二分图、交叉染色法、Tarjan算法,详见《算法竞赛进阶指南》P407-408。

代码:

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<vector>
using namespace std;
const int N = 1010, M = 2000010;
int head[N], ver[M], Next[M];
int dfn[N], low[N], stack[N];
int c[N], v[N], able[N];
int n, m, tot, num, top, cnt, now;
bool hate[N][N], flag;
vector<int> dcc[N];void add(int x, int y) {ver[++tot] = y, Next[tot] = head[x], head[x] = tot;
}void tarjan(int x, int root) {dfn[x] = low[x] = ++num;stack[++top] = x;if (x == root && head[x] == 0) { // 孤立点dcc[++cnt].push_back(x);return;}for (int i = head[x]; i; i = Next[i]) {int y = ver[i];if (!dfn[y]) {tarjan(y, root);low[x] = min(low[x], low[y]);if (low[y] >= dfn[x]) {cnt++;int z;do {z = stack[top--];dcc[cnt].push_back(z);} while (z != y);dcc[cnt].push_back(x);}}else low[x] = min(low[x], dfn[y]);}
}void dfs(int x, int color) {c[x] = color;for (int i = head[x]; i; i = Next[i]) {int y = ver[i];if (v[y] != now) continue;if (c[y] && c[y] == color) {flag = 1;return;}if (!c[y]) dfs(y, 3 - color);}
}int main() {while (cin >> n >> m && n) {// 清零memset(head, 0, sizeof(head));memset(dfn, 0, sizeof(dfn));memset(able, 0, sizeof(able));memset(v, 0, sizeof(v));for (int i = 1; i <= n; i++) dcc[i].clear();tot = 1; num = top = cnt = 0;for (int i = 1; i <= n; i++)for (int j = 1; j <= n; j++) hate[i][j] = 0;for (int i = 1; i <= m; i++) {int x, y;scanf("%d%d", &x, &y);if (x == y) continue;hate[x][y] = hate[y][x] = 1;}// 建补图for (int i = 1; i < n; i++)for (int j = i + 1; j <= n; j++)if (!hate[i][j]) add(i, j), add(j, i);// 求点双连通分量for (int i = 1; i <= n; i++)if (!dfn[i]) tarjan(i, i);// 判断每个点双是否包含奇环for (int i = 1; i <= cnt; i++) {now = i;for (int j = 0; j < dcc[i].size(); j++)v[dcc[i][j]] = now, c[dcc[i][j]] = 0;flag = false;dfs(dcc[i][0], 1);if (flag)for (int j = 0; j < dcc[i].size(); j++)able[dcc[i][j]] = 1;}int ans = 0;for (int i = 1; i <= n; i++)if (!able[i]) ans++;cout << ans << endl;}return 0;
}

poj2942 圆桌骑士(点双连通分量+二分图染色法判奇环)相关推荐

  1. POJ 2942 Knights of the Round Table 【点双联通 + 二分图染色法判奇环】

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

  2. 图的遍历(染色法判断奇环)

    图的遍历(染色法判断奇环) 传送门 思路:首先图应该为连通图,所需要加的边数即addedge=add_{edge}=addedge​=连通块数−1-1−1 然后又因为是要每次走两步,即最后要走偶数步即 ...

  3. 【LA3523 训练指南】圆桌骑士 【双连通分量】

    题意 有n个骑士经常举行圆桌会议,商讨大事.每次圆桌会议至少应有3个骑士参加,且相互憎恨的骑士不能坐在圆桌旁的相邻位置.如果发生意见分歧,则需要举手表决,因此参加会议的骑士数目必须是奇数,以防赞同和反 ...

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

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

  5. poj 2942-圆桌骑士(点双连通分量+二分图)

    题目:http://poj.org/problem?id=2942 题意: 一群骑士,某些骑士之间互相憎恨,如果在一起容易发生争斗事件,因此他们只有满足一定条件才能参加圆桌会议:1.圆桌边上任意相邻的 ...

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

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

  7. 【图的连通性】poj2942圆桌骑士

    题目描述:有n个骑士,他们有些人之间有矛盾,现在要求选出一些骑士围成一圈,圈要满足如下条件:1.人数大于1.2.总人数为奇数.3.有仇恨的骑士不能挨着坐.问有几个骑士不能和任何人形成任何的圆圈. 这是 ...

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

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

  9. poj2942 圆桌骑士

    题目大意:给定n个骑士以及m个讨厌关系,让你找到满足以下关系的需要减去骑士的最少数: 1.每个骑士的两边必须是自己的朋友! 2.每个桌子上必须坐奇数个人,这就意味着必须转化为一个奇圈,如果一个骑士不能 ...

最新文章

  1. facebook新无监督论文-Unsupervised Learning of Visual Features by Contrasting Cluster Assignments
  2. Realm Mobile Platform添加水平可扩展性,支持遗留数据源和复制
  3. Redis实现分布式锁全局锁—Redis客户端Redisson中分布式锁RLock实现
  4. sqlserver快速查找所有存储过程中是否包含某字符
  5. linux虚拟机 xen,XEN虚拟机在Linux上的安装和使用教程分享
  6. 代码中,对象类与管理类要分开
  7. Springboot加载静态图片
  8. 微信小程序注册流程图文详解
  9. 搜索引擎模块设计与实现——相关度搜索算法模块
  10. Excel,ppt学习课后总结
  11. FlashBuilder精选插件
  12. 获取微信小程序的APPID及任意一个页面的路径信息
  13. Java基础---继承、抽象、接口
  14. 安装和使用PyInstaller生成window的exe和Mac的执行文件
  15. AVL树 01 AVL树基础
  16. Swagger的三个常用注解
  17. 28.41dB,视频超分最新力作:PFNL+双向信息传播=OVSR
  18. 文末有惊喜 | 开通微信公众号留言功能,只需3步!
  19. 外网远程控制局域网内主机,路由器端口转发设置
  20. 【题解】慈溪中学-8.15-T1

热门文章

  1. 三维图像专业处理软件Dragonfly 应用-如何计算面孔隙率
  2. springboot集成knif4j,swagger
  3. 第一次博客(比特虫):网站favicon.ico图标介绍,制作
  4. MySQL各数据类型总结
  5. BERT生成能力改进:分离对话生成和对话理解
  6. 这可能是东半球最详细的Linux下搭建Jenkins服务器实现自动打包的教程(下)
  7. Flood fill algorithm
  8. c语言用库函数求正弦数,用C语言求正弦值?
  9. ps aux mysql_ps -aux的错误用法
  10. YOLOv5 修改detect模块以方便调用(单类型目标)