POJ 2942.Knights of the Round Table (双连通)
简要题解:
意在判断哪些点在一个图的 奇环的双连通分量内。
tarjan求出所有的点双连通分量,再用二分图染色判断每个双连通分量是否形成了奇环,记录哪些点出现在内奇环内
输出没有在奇环内的点的数目
code
/*
求有向图的点双连通分支tarjan算法
思路:
1.对图先进行深度优先搜索形成搜索数,计算每一个节点的先深编号dfn[n]
2.计算所有节点v的low[v]是在先深生成树上按照后根遍历的顺序进行的.
因此,当仿问节点v时它的每一个儿子u的low[u]已经计算完毕这时low[v]取下面三值的最小者:
1)dfn[v];
2)dfn[w],对于回退边(v,w)
3)low[u],对于v的任何儿子u
3.判断一个顶点是不是桥,割点:
a)v为树根,且v有多于1个子树
b)v不为树根,且满足存在边(v,u) ,使得dfn[v]<=low[u].
*/
#include <iostream>
#include <cstdio>
#include <cstring>
#define INF 1009
using namespace std;
int n, m, x, y;
bool g[INF][INF];
int low[INF], dfn[INF], sta[INF], ans[INF][INF], f[INF], ok[INF], Top, Max , tcc, t;
bool make (int x, int cow) {
for (int i = 0; i < cow; i++) {
int v = ans[tcc][i];
if (x != v && g[x][v]) {
if (f[v] == -1) {
f[v] = !f[x];
if (make (v, cow) ) return 1;
}
else if (f[v] == f[x]) return 1;
}
}
return 0;
}
void check (int cow) {
memset (f, -1, sizeof f);
f[ans[tcc][0]] = 0;
if (make (ans[tcc][0], cow) )
for (int i = 0; i < cow; i++)
ok[ans[tcc][i]] = 1;
}
void dfs (int k, int from) {
sta[++Top] = k;
low[k] = dfn[k] = ++t;
for (int i = 1; i <= n; i++) {
if (i == from || g[k][i] == 0 || k == i) continue;
if (!dfn[i]) {
dfs (i, k);
low[k] = min (low[k], low[i]);
if (dfn[k] <= low[i]) {
ans[tcc][0] = k;
int cow = 1;
do
ans[tcc][cow++] = sta[Top];
while (sta[Top--] != i);
if (cow > 2) check (cow), ++tcc;
}
}
else low[k] = min (low[k], dfn[i]);
}
return ;
}
void Tarjan (int n) {
memset (low, 0, sizeof low);
memset (dfn, 0, sizeof dfn);
Top = tcc = t = 0;
for (int i = 1; i <= n; i++)
if (dfn[i] == 0) dfs (i, -1);
}
int main() {
while (~scanf ("%d %d", &n, &m) ) {
if (n == 0 && m == 0) return 0;
memset (g, 1, sizeof g);
memset (ok, 0, sizeof ok);
Max = 0;
for (int i = 1; i <= m; i++) {
scanf ("%d %d", &x, &y);
g[x][y] = g[y][x] = 0;
}
Tarjan (n);
int ans = 0;
for (int i = 1; i <= n; i++)
if (!ok[i]) ans++;
printf ("%d\n", ans);
}
return 0;
}
POJ 2942.Knights of the Round Table (双连通)的更多相关文章
- POJ 2942 Knights of the Round Table 黑白着色+点双连通分量
题目来源:POJ 2942 Knights of the Round Table 题意:统计多个个骑士不能參加随意一场会议 每场会议必须至少三个人 排成一个圈 而且相邻的人不能有矛盾 题目给出若干个条 ...
- poj 2942 Knights of the Round Table 圆桌骑士(双连通分量模板题)
Knights of the Round Table Time Limit: 7000MS Memory Limit: 65536K Total Submissions: 9169 Accep ...
- poj 2942 Knights of the Round Table - Tarjan
Being a knight is a very attractive career: searching for the Holy Grail, saving damsels in distress ...
- POJ 2942 Knights of the Round Table
Knights of the Round Table Time Limit: 7000MS Memory Limit: 65536K Total Submissions: 10911 Acce ...
- POJ 2942 Knights of the Round Table - from lanshui_Yang
Description Being a knight is a very attractive career: searching for the Holy Grail, saving damsels ...
- POJ 2942 Knights of the Round Table (点双连通分量)
题意:多个骑士要开会,3人及以上才能凑一桌,其中部分人已经互相讨厌,肯定不坐在同一桌的相邻位置,而且一桌只能奇数个人才能开台.给出多个人的互相讨厌图,要求多少人开不成会(注:会议不要求同时进行,一个人 ...
- poj 2942 Knights of the Round Table(点双连通分量+二分图判定)
题目链接:http://poj.org/problem?id=2942 题意:n个骑士要举行圆桌会议,但是有些骑士相互仇视,必须满足以下两个条件才能举行: (1)任何两个互相仇视的骑士不能相邻,每个骑 ...
- POJ 2942 Knights of the Round Table(双连通分量)
http://poj.org/problem?id=2942 题意 :n个骑士举行圆桌会议,每次会议应至少3个骑士参加,且相互憎恨的骑士不能坐在圆桌旁的相邻位置.如果意见发生分歧,则需要举手表决,因此 ...
- POJ - 2942 Knights of the Round Table (点双联通分量+二分图判定)
题意:有N个人要参加会议,围圈而坐,需要举手表决,所以每次会议都必须是奇数个人参加.有M对人互相讨厌,他们的座位不能相邻.问有多少人任意一场会议都不能出席. 分析:给出的M条关系是讨厌,将每个人视作点 ...
随机推荐
- http 协议的过程
当你输入某个网址的时候发生了什么? 首先:你该知道 a.http协议是应用层协议,他是浏览器像服务器请求网页,服务器返回网页的过程,他是基于tcp协议的. 1.假设随便输入输入域名 http://ww ...
- content
http://www.cnblogs.com/lrysjtu/p/4474900.html lexus - 博客园 http://www.cnblogs.com/rio2607/p/4472456.h ...
- 4 hbase表结构 + hbase集群架构及表存储机制
本博文的主要内容有 .hbase读取数据过程 .HBase表结构 .附带PPT http://hbase.apache.org/ 读写的时候,就需要用hbase了,换句话说,就是读写的时候. ...
- hdu 1010 dfs搜索
Tempter of the Bone Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Othe ...
- textarea文本域
textarea中换行问题 一旦用nl2br函数处理会多个\n导致十分难看 也无法形成文本框默认效果 前台的html如果用<br/>处理也会给后台的编辑造成困难 所以在编辑的时候这样处理 ...
- PHP运行出现Notice : Use of undefined constant 的解决方法【已测】
关闭 PHP 提示的方法 搜索php.ini:error_reporting = E_ALL改为:error_reporting = E_ALL & ~E_NOTICE还有个不是办法的办法就是 ...
- SQL字符串处理函数大全
select语句中只能使用sql函数对字段进行操作(链接sql server),select 字段1 from 表1 where 字段1.IndexOf("云")=1;这条语句不对 ...
- 移植QT到ZedBoard(制作运行库镜像) 交叉编译 分类: ubuntu shell ZedBoard OpenCV 2014-11-08 18:49 219人阅读 评论(0) 收藏
制作运行库 由于ubuntu的Qt运行库在/usr/local/Trolltech/Qt-4.7.3/下,由makefile可以看到引用运行库是 INCPATH = -I/usr//mkspecs/d ...
- Android 手动显示和隐藏软键盘
1.方法一(如果输入法在窗口上已经显示,则隐藏,反之则显示) InputMethodManager imm = (InputMethodManager) getSystemService(Contex ...
- 晨曦之光 linux Crontab 使用(转)
cron用法说明 cron的用法老是记不住,索性写下来备忘.下文内容大部分是根据<Cron Help Guide>翻译而来,有些部分是自己加上的. 全文如下: cron来源于希腊单词chr ...