POJ 2942 圆桌骑士
之前做过这个题目,现在回想起来,又有新的柑橘。
求必须出去的骑士人数。
每一个双连通分量,如果是一个奇圈,那么一定是二分图染色失败。
依次遍历每个双连通分量,但是,对于邻接表中,有一些点不是双连通分量里面的,于是要重新编号bccno,因为割点bccno只有一个值,
但是,他要多次使用,因此要重新编号bccno
#include <cstdio> #include <cstring> #include <stack> #include <vector> #include <iostream> #include <algorithm>using namespace std;const int maxn = 1000 + 5;int pre[maxn]; 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 A[maxn][maxn];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/7218849.html
POJ 2942 圆桌骑士相关推荐
- POJ 2942 圆桌骑士 (点双学习笔记)
割点 在无向连通图G上进行如下定义: • 割点:若删掉某点P后,G分裂为两个或两个以上的子图,则称P为G的割点. • 割点集合:在无向连通图G中,如果有一个顶点集合,删除这个顶点集合以及与该点集中 的 ...
- poj 2942 圆桌骑士 无向图割点 奇圈 交叉染色
连通类经典题 题意及分析参考: 1.建反向图 2.tarjan 算法求割点3.二部图与奇圈 4.交叉染色 http://blog.csdn.net/lyy289065406/article/detai ...
- 圆桌骑士 图的连通性
题目描述 圆桌骑士是一个非常吸引人的职业.因此,在最近几年里,亚瑟王史无前例的扩招圆桌骑士,并不令人惊讶.现在这里有许多圆桌骑士,每个圆桌骑士都收到一份珍贵的邀请函,被邀请去英灵殿圆桌.这些骑士将要环 ...
- 强连通分量 圆桌骑士
题目描述 圆桌骑士是一个非常吸引人的职业.因此,在最近几年里,亚瑟王史无前例的扩招圆桌骑士,并不令人惊讶.现在这里有许多圆桌骑士,每个圆桌骑士都收到一份珍贵的邀请函,被邀请去英灵殿圆桌.这些骑士将要环 ...
- POJ2942 UVA1364 Knights of the Round Table 圆桌骑士
POJ2942 洛谷UVA1364(博主没有翻墙uva实在是太慢了) 以骑士为结点建立无向图,两个骑士间存在边表示两个骑士可以相邻(用邻接矩阵存图,初始化全为1,读入一对憎恨关系就删去一条边即可),则 ...
- 以圆桌骑士为例浅尝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 ...
- flash硕思闪客V2005便携绿色破解版圆桌骑士简体中文豪华套装
flash硕思闪客V2005便携绿色破解版圆桌骑士简体中文豪华套装 flash硕思闪客V2005便携绿色破解版圆桌骑士简体中文豪华套装 http://down.htcnc.net/Software/C ...
最新文章
- Could not resolve archetype org.apache.maven.archetypes:maven-archetype-quickstart
- 快速迭代的测试人员的思考
- 2017届-应届毕业生-兆芯 GPU architecture design校招在线笔试题
- 寻找大富翁 (25 分)
- Helm-chart学习-简单介绍与使用
- 干货丨时序数据库DolphinDB脚本语言的混合范式编程
- iOS 11 发布!巨大进步、里程碑式飞跃!
- 期货接盘(期货接盘什么意思)
- python时分秒_python时间时分秒与秒数的互相转换
- 中小企业建立中台的条件
- POT超阈值模型和极值理论EVT分析
- 社区发现之标签传播算法(LPA)
- matlab kalman 跟踪,Kalman matlab中基于卡尔曼滤波的目标跟踪程序 272万源代码下载- www.pudn.com...
- 美化WinForm第三方框架DevExpress
- 机器人轴配置数据详解
- 今日早报 每日精选12条新闻简报 每天一分钟 知晓天下事 6月21日
- 全选反选按钮简单例子
- FTP主动模式和被动模式
- 房产中介、房屋租赁、房屋买卖APP(H5)
- 自媒体文章怎么写?学会这3个写作方法,让你轻松写出好文章