题目链接:http://vjudge.net/contest/141787#problem/A

http://poj.org/problem?id=2942

此题很经典

知识点:DFS染色,点-双连通

题意:

亚瑟王要在圆桌上召开骑士会议,为了不引发骑士之间的冲突,并且能够让会议的议题有令人满意的结果,每次开会前都必须对出席会议的骑士有如下要求:

1、  相互憎恨的两个骑士不能坐在直接相邻的2个位置;

2、  出席会议的骑士数必须是奇数,这是为了让投票表决议题时都能有结果。

如果出现有某些骑士无法出席所有会议(例如这个骑士憎恨所有的其他骑士),则亚瑟王为了世界和平会强制把他剔除出骑士团。

现在给定准备去开会的骑士数n,再给出m对憎恨对(表示某2个骑士之间使互相憎恨的),问亚瑟王至少要剔除多少个骑士才能顺利召开会议?

能够坐在一起的人,连一条边,题目就是求所有的点中,有多少个点不在任何一个奇圈里。

这个无向图,求出每个点双连通分量,但是不是每个点双连通分量都是奇圈,如果它是偶圈,那么就可以用 dfs 染色,这样我们把每个点连通分量染色,要是染色失败,那么这些点都可以构成奇圈,也就是说这些点都OK。最后查一遍这些点。

有了之前的 无向图的割顶,桥,点-双连通分量,DFS染色,就好写好多了!!!

#include <bits/stdc++.h>
#include <stdio.h>
#include <stack>
#include <algorithm>
#include <string.h>
#include <vector>using namespace std;const int Maxn = 1000 +10;int A[Maxn][Maxn];int pre[Maxn<<1];
bool iscut[Maxn];
int bccno[Maxn];
int dfs_clock;
int bcc_cnt;vector <int> G[Maxn],bcc[Maxn];struct Edge
{int u,v;Edge(int u=0,int v=0) : u(u),v(v) {}
};stack <Edge> S;int dfs(int u, int fa)
{int lowu = pre[u] = ++dfs_clock;int child = 0;for(int i = 0; i < G[u].size(); i++){int v = G[u][i];Edge e = (Edge){u,v};if(!pre[v]){S.push(e);child++;int lowv = dfs(v, u);lowu = min(lowu, lowv);if(lowv >= pre[u]){iscut[u] = true;bcc_cnt++;bcc[bcc_cnt].clear();for(;;){Edge x = S.top();S.pop();if(bccno[x.u] != bcc_cnt){bcc[bcc_cnt].push_back(x.u);bccno[x.u] = bcc_cnt;}if(bccno[x.v] != bcc_cnt){bcc[bcc_cnt].push_back(x.v);bccno[x.v] = bcc_cnt;}if(x.u == u && x.v == v) break;}}}else if(pre[v] < pre[u] && v != fa){S.push(e);lowu = min(lowu, pre[v]);}}if(fa < 0 && child == 1) iscut[u] = 0;return lowu;
}void find_bcc(int n)
{memset(pre, 0, sizeof(pre));memset(iscut, 0, sizeof(iscut));memset(bccno, 0, sizeof(bccno));dfs_clock = bcc_cnt = 0;for(int i = 0; i < n; i++)if(!pre[i]) dfs(i, -1);
}int odd[Maxn], color[Maxn];
bool bipartite(int u, int b)
{for(int i = 0; i < G[u].size(); i++){int v = G[u][i];if(bccno[v] != b) continue;if(color[v] == color[u]) return false;if(!color[v]){color[v] = 3 - color[u];if(!bipartite(v, b)) return false;}}return true;
}int main()
{int  n, m;while(scanf("%d%d", &n, &m) == 2 && n){for(int i = 0; i < n; i++) G[i].clear();memset(A, 0, sizeof(A));for(int i = 0; i < m; i++){int u, v;scanf("%d%d", &u, &v);u--;v--;A[u][v] = A[v][u] = 1;}for(int u = 0; u < n; u++)for(int v = u+1; v < n; v++)if(!A[u][v]){G[u].push_back(v);G[v].push_back(u);}find_bcc(n);memset(odd, 0, sizeof(odd));for(int i = 1; i <= bcc_cnt; i++){memset(color, 0, sizeof(color));for(int j = 0; j < bcc[i].size(); j++)bccno[bcc[i][j]] = i;int u = bcc[i][0];color[u] = 1;if(!bipartite(u, i)){for(int j = 0; j < bcc[i].size(); j++)odd[bcc[i][j]] = 1;}}int ans = n;for(int i = 0; i < n; i++)if(odd[i])ans--;printf("%d\n", ans);}return 0;
}

View Code

转载于:https://www.cnblogs.com/TreeDream/p/6067635.html

LA 3523 圆桌骑士相关推荐

  1. LA 3523 圆桌骑士 (双连通)

    题目大意:n个骑士参加会议,互相怨恨的不能够坐在一起.会议至少要有3人参加并且参加会议的人数为奇数.问有多少个骑士不能参加任何会议. 本质就是求不在任何一个奇圈上的节点个数. 二分图一定不含奇圈. 非 ...

  2. UVALive 3523 圆桌骑士

    题目大意:有n个骑士经常举行圆桌会议,每次圆桌会议至少要有3个骑士参加(且每次参加的骑士数量是奇数个),且所有互相憎恨的骑士不能坐在圆桌旁的相邻位置,问有多少个骑士不可能参加任何一个会议 思路,首先根 ...

  3. 圆桌骑士 图的连通性

    题目描述 圆桌骑士是一个非常吸引人的职业.因此,在最近几年里,亚瑟王史无前例的扩招圆桌骑士,并不令人惊讶.现在这里有许多圆桌骑士,每个圆桌骑士都收到一份珍贵的邀请函,被邀请去英灵殿圆桌.这些骑士将要环 ...

  4. 强连通分量 圆桌骑士

    题目描述 圆桌骑士是一个非常吸引人的职业.因此,在最近几年里,亚瑟王史无前例的扩招圆桌骑士,并不令人惊讶.现在这里有许多圆桌骑士,每个圆桌骑士都收到一份珍贵的邀请函,被邀请去英灵殿圆桌.这些骑士将要环 ...

  5. POJ2942 UVA1364 Knights of the Round Table 圆桌骑士

    POJ2942 洛谷UVA1364(博主没有翻墙uva实在是太慢了) 以骑士为结点建立无向图,两个骑士间存在边表示两个骑士可以相邻(用邻接矩阵存图,初始化全为1,读入一对憎恨关系就删去一条边即可),则 ...

  6. POJ 2942 圆桌骑士 (点双学习笔记)

    割点 在无向连通图G上进行如下定义: • 割点:若删掉某点P后,G分裂为两个或两个以上的子图,则称P为G的割点. • 割点集合:在无向连通图G中,如果有一个顶点集合,删除这个顶点集合以及与该点集中 的 ...

  7. 以圆桌骑士为例浅尝HTML5游戏开发

    随着XHTML的逐渐式微,Chrome,Safari,FireFox,Opera等现代浏览器正在积极完善HTML5实现,IE9也加入到标准的行列并将在今年上半年发布正式版,HTML5时代来临了. 在各 ...

  8. 网页中在线玩圆桌骑士

    演示一个在网页中在线玩街机游戏圆桌骑士的代码: http://www.return8090.com

  9. JS版圆桌骑士DEMO

    同学们,我参加了IE9开发大赛,作品是网页版圆桌骑士,喜欢的话帮忙投票吧! [url=http://ie9.onlinevoc.cn/contest/PercodPage.aspx?ID=43]htt ...

最新文章

  1. 紧急提醒!售价3980,成本价80,你被坑过吗?
  2. c语言程序设计文件操作,c语言程序设计文件操作方法示例(CreateFile和fopen)
  3. DataV 支持 token 验证啦!
  4. 并发的核心:CAS 是什么?Java8是如何优化 CAS 的?
  5. 订单分类和评分--vue.js学习笔记2
  6. ITK:跳过特定区域时在图像上迭代
  7. linux查看 idt日志,实现RCP的日志管理
  8. 简单的01背包和完全背包
  9. 上拉加载更多后台数据_微信小程序端操作云数据库
  10. Hadoop之WEBUi界面功能介绍及日志配置查看
  11. 创建IPSEC连接安全
  12. PHP弱类型安全问题总结
  13. 语音识别人工智能解决方案
  14. java stream流_恕我直言你可能真的不会java第4篇:Stream管道流Map操作
  15. Android中设置位移动画的停止
  16. Rust : 性能测试criterion库
  17. 【BUUCTF】[SWPU2019]神奇的二维码
  18. 最新服务器处理器天梯,2019服务器CPU天梯图之性能排行榜(双路三路四路) - 服务器百科...
  19. unity迷你太空射击游戏截图
  20. Layui使用入门教程

热门文章

  1. 下列哪个不是python元组的定义方式_Python基础知识笔试
  2. SQL笔记-检索出ID为Int或Long中不连续的第一个点
  3. Java笔记-以系统时间为基准15分钟运行一次指定代码
  4. Java工作笔记-IntelliJ IDEA中的精确搜索
  5. Qt5.8 Windows端 关于 Style Plugin Example 官方实例中的错误
  6. Qt文档阅读笔记-Qt Concurrent介绍及简单使用
  7. 7.3图的遍历(广度优先)-理论
  8. 季枫老师java全集_PHP冒泡排序,摘取季枫老师视频的冒泡排序内容!
  9. eol python_乱记 EOL(End of Line)在windows和linux不同导致的Python问题
  10. python 相关性检验怎么计算p值_不会Python进行时间序列预测?不要紧,大神来教你...