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条关系是讨厌,将每个人视作点 ...
随机推荐
- HDU-1035 Robot Motion
http://acm.hdu.edu.cn/showproblem.php?pid=1035 Robot Motion Time Limit: 2000/1000 MS (Java/Others) ...
- 参数化时按行读取txt文件,如何去掉换行符"\n"
参数化按行读取txt,每行默认自带了回车换行操作,导致脚本报错,故而按行读取时,需要去掉默认的'\n' #coding=utf-8 from selenium import webdriver imp ...
- tomcat 配置内存相关
今天早上 ,tomcat 网站页面上出现报错问题.最后还是一位同事解决的,这里记录一下. 1.看了一下页面,他说是内存溢出. 首先找到 双击 Tomw.exe 出现如下图 然后需要配置堆栈大小
- java多线程编程(2)交替输出数字和字母
mark一下,不停的看看notify和wait的没有理解 class Printer { int index=0; //输出奇数 public synchronized void printA(int ...
- GitHub上整理的一些工具,求补充
http://segmentfault.com/q/1010000002404545 技术站点 Hacker News:非常棒的针对编程的链接聚合网站 Programming reddit:同上 MS ...
- java ee eclipse 配置 ssh框架
mvnDebug tomcat:run 这条命令主要用来远程测试,它会监听远程测试用的8000端口,在eclipse里打开远程测试后,它就会跑起来了,设断点,调试,一切都是这么简单. 0.如果是mav ...
- PHP+IIS7+PHPMangerForIIS搭建开发环境
准备工作 1.安装IIS 2.安装php 3.安装phpmanager 准备工作做好后,开始搭建环境 1.在Internet信息服务管理器下找到PHPManager 2.点击Register new ...
- DataTable无法使用AsEnumerable ()的解决办法
本人定义了DataSet后将表1赋给datatable,在写linq时调用datatable.asenumerable(),但报datatable不包含asenumerable的定义,求高手指点.Sy ...
- IIS7 和IIS8.0 HTTP 错误 500.19 - Internal Server Error 问题的解决方式
百度了好久,没找到解决这个问题确切的答案,我也知道肯定是权限的问题,当然,经过一番尝试之后,最终攻克了,解决之道例如以下(个人方法,能够一试): 1.找到你的配置文件所在的目录,我的是 E:\源代码\ ...
- git常见指令
master : 默认开发分支: origin : 默认远程版本库 初始化操作 $ git config -global user.name <name> #设置提交者名字 $ ...