之前做过这个题目,现在回想起来,又有新的柑橘。

求必须出去的骑士人数。

每一个双连通分量,如果是一个奇圈,那么一定是二分图染色失败。

依次遍历每个双连通分量,但是,对于邻接表中,有一些点不是双连通分量里面的,于是要重新编号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 圆桌骑士相关推荐

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

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

  2. poj 2942 圆桌骑士 无向图割点 奇圈 交叉染色

    连通类经典题 题意及分析参考: 1.建反向图 2.tarjan 算法求割点3.二部图与奇圈 4.交叉染色 http://blog.csdn.net/lyy289065406/article/detai ...

  3. 圆桌骑士 图的连通性

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

  4. 强连通分量 圆桌骑士

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

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

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

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

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

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

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

  8. JS版圆桌骑士DEMO

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

  9. flash硕思闪客V2005便携绿色破解版圆桌骑士简体中文豪华套装

    flash硕思闪客V2005便携绿色破解版圆桌骑士简体中文豪华套装 flash硕思闪客V2005便携绿色破解版圆桌骑士简体中文豪华套装 http://down.htcnc.net/Software/C ...

最新文章

  1. Could not resolve archetype org.apache.maven.archetypes:maven-archetype-quickstart
  2. 快速迭代的测试人员的思考
  3. 2017届-应届毕业生-兆芯 GPU architecture design校招在线笔试题
  4. 寻找大富翁 (25 分)
  5. Helm-chart学习-简单介绍与使用
  6. 干货丨时序数据库DolphinDB脚本语言的混合范式编程
  7. iOS 11 发布!巨大进步、里程碑式飞跃!
  8. 期货接盘(期货接盘什么意思)
  9. python时分秒_python时间时分秒与秒数的互相转换
  10. 中小企业建立中台的条件
  11. POT超阈值模型和极值理论EVT分析
  12. 社区发现之标签传播算法(LPA)
  13. matlab kalman 跟踪,Kalman matlab中基于卡尔曼滤波的目标跟踪程序 272万源代码下载- www.pudn.com...
  14. 美化WinForm第三方框架DevExpress
  15. 机器人轴配置数据详解
  16. 今日早报 每日精选12条新闻简报 每天一分钟 知晓天下事 6月21日
  17. 全选反选按钮简单例子
  18. FTP主动模式和被动模式
  19. 房产中介、房屋租赁、房屋买卖APP(H5)
  20. 自媒体文章怎么写?学会这3个写作方法,让你轻松写出好文章

热门文章

  1. 鸿蒙手机Beta版本官宣!我们带着成果和Code来了!!
  2. TLD7002学习笔记(一)-芯片介绍
  3. 蓝牙的基本概念以及发展轨迹 - 蓝牙的前生后世
  4. 微型计算机的字符信息编码方案,微型计算机中普遍采用的字符信息编码方案是(.doc...
  5. 微信PC版史诗级更新,终于摆脱手机了!
  6. 【微博技巧】绕开微博绑定手机注册微博
  7. JAVA程序员面试总结
  8. E-puck2机器人系列教程
  9. 稻盛和夫:只有极度认真工作,才能扭转人生!
  10. 强哥说Java--Java Scanner 类