LA 3523 圆桌骑士
题目链接: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 圆桌骑士相关推荐
- LA 3523 圆桌骑士 (双连通)
题目大意:n个骑士参加会议,互相怨恨的不能够坐在一起.会议至少要有3人参加并且参加会议的人数为奇数.问有多少个骑士不能参加任何会议. 本质就是求不在任何一个奇圈上的节点个数. 二分图一定不含奇圈. 非 ...
- UVALive 3523 圆桌骑士
题目大意:有n个骑士经常举行圆桌会议,每次圆桌会议至少要有3个骑士参加(且每次参加的骑士数量是奇数个),且所有互相憎恨的骑士不能坐在圆桌旁的相邻位置,问有多少个骑士不可能参加任何一个会议 思路,首先根 ...
- 圆桌骑士 图的连通性
题目描述 圆桌骑士是一个非常吸引人的职业.因此,在最近几年里,亚瑟王史无前例的扩招圆桌骑士,并不令人惊讶.现在这里有许多圆桌骑士,每个圆桌骑士都收到一份珍贵的邀请函,被邀请去英灵殿圆桌.这些骑士将要环 ...
- 强连通分量 圆桌骑士
题目描述 圆桌骑士是一个非常吸引人的职业.因此,在最近几年里,亚瑟王史无前例的扩招圆桌骑士,并不令人惊讶.现在这里有许多圆桌骑士,每个圆桌骑士都收到一份珍贵的邀请函,被邀请去英灵殿圆桌.这些骑士将要环 ...
- POJ2942 UVA1364 Knights of the Round Table 圆桌骑士
POJ2942 洛谷UVA1364(博主没有翻墙uva实在是太慢了) 以骑士为结点建立无向图,两个骑士间存在边表示两个骑士可以相邻(用邻接矩阵存图,初始化全为1,读入一对憎恨关系就删去一条边即可),则 ...
- POJ 2942 圆桌骑士 (点双学习笔记)
割点 在无向连通图G上进行如下定义: • 割点:若删掉某点P后,G分裂为两个或两个以上的子图,则称P为G的割点. • 割点集合:在无向连通图G中,如果有一个顶点集合,删除这个顶点集合以及与该点集中 的 ...
- 以圆桌骑士为例浅尝HTML5游戏开发
随着XHTML的逐渐式微,Chrome,Safari,FireFox,Opera等现代浏览器正在积极完善HTML5实现,IE9也加入到标准的行列并将在今年上半年发布正式版,HTML5时代来临了. 在各 ...
- 网页中在线玩圆桌骑士
演示一个在网页中在线玩街机游戏圆桌骑士的代码: http://www.return8090.com
- JS版圆桌骑士DEMO
同学们,我参加了IE9开发大赛,作品是网页版圆桌骑士,喜欢的话帮忙投票吧! [url=http://ie9.onlinevoc.cn/contest/PercodPage.aspx?ID=43]htt ...
最新文章
- 紧急提醒!售价3980,成本价80,你被坑过吗?
- c语言程序设计文件操作,c语言程序设计文件操作方法示例(CreateFile和fopen)
- DataV 支持 token 验证啦!
- 并发的核心:CAS 是什么?Java8是如何优化 CAS 的?
- 订单分类和评分--vue.js学习笔记2
- ITK:跳过特定区域时在图像上迭代
- linux查看 idt日志,实现RCP的日志管理
- 简单的01背包和完全背包
- 上拉加载更多后台数据_微信小程序端操作云数据库
- Hadoop之WEBUi界面功能介绍及日志配置查看
- 创建IPSEC连接安全
- PHP弱类型安全问题总结
- 语音识别人工智能解决方案
- java stream流_恕我直言你可能真的不会java第4篇:Stream管道流Map操作
- Android中设置位移动画的停止
- Rust : 性能测试criterion库
- 【BUUCTF】[SWPU2019]神奇的二维码
- 最新服务器处理器天梯,2019服务器CPU天梯图之性能排行榜(双路三路四路) - 服务器百科...
- unity迷你太空射击游戏截图
- Layui使用入门教程
热门文章
- 下列哪个不是python元组的定义方式_Python基础知识笔试
- SQL笔记-检索出ID为Int或Long中不连续的第一个点
- Java笔记-以系统时间为基准15分钟运行一次指定代码
- Java工作笔记-IntelliJ IDEA中的精确搜索
- Qt5.8 Windows端 关于 Style Plugin Example 官方实例中的错误
- Qt文档阅读笔记-Qt Concurrent介绍及简单使用
- 7.3图的遍历(广度优先)-理论
- 季枫老师java全集_PHP冒泡排序,摘取季枫老师视频的冒泡排序内容!
- eol python_乱记 EOL(End of Line)在windows和linux不同导致的Python问题
- python 相关性检验怎么计算p值_不会Python进行时间序列预测?不要紧,大神来教你...