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条关系是讨厌,将每个人视作点 ...
随机推荐
- 【转】在VMware中安装OS X Yosemite
原文网址:http://blog.gaohaobo.com/229.html OS X(前称:Mac OS X)操作系统是由苹果公司(Apple Inc.)为其Mac系列产品开发的.基于Unix的专属 ...
- java String 去除空格
1. java 去掉字符串的空格(中间空格,左右空格) 比如 时间字符串,去掉‘-’,‘:’,与空格 String x = "2008-09-08 11:12:23"; x=x.r ...
- CSS 概览(CSS2.1)更新时间2014-0406
CSS和HTML结合 <link rel="stylesheet" type="text/css" href="sheet1.css" ...
- [JIT_APP]Android SQLite简介
SQLite介绍 SQLite是一个非常流行的嵌入式数据库,它支持SQL语言,并且只利用很少的内存就有很好的性能.此外它还是开源的,任何人都可以使用它.许多开源项目(Mozilla, PHP, Pyt ...
- Torque2D MIT 学习笔记(27) ---- ImageFont的使用以及字体ImageAsset的工具生成
前言 ImageFont继承于SceneObject,是一个场景对象,支持例如旋转,缩放,移动加速度以及物理碰撞等一切Torque中场景对象的一切功能. ImageFont只支持ASCII编码表中的3 ...
- hdu 4414 暴力枚举
#include <cstdio> #include <cstring> #include <iostream> #include <cmath> #i ...
- The Doors - POJ 1556 (线段相交)
题目大意:有一个房间(左上角(0,10),右下角(10,0)),然后房间里有N面墙,每面墙上都有两个门,求出来从初始点(0,5),到达终点(10,5)的最短距离. 分析:很明显根据两点之间直线最短 ...
- Spring IOC配置与应用
1. FAQ:不给提示: a) window – preferences – myeclipse – xml – xml catalog b) User Specified E ...
- python数据类型和3个重要函数
Python中所有变量都是值的引用,也就说变量通过绑定的方式指向其值. 而这里说的不可变指的是值的不可变. 对于不可变类型的变量,如果要更改变量,则会创建一个新值,把变量绑定到新值上,而旧值如果没有被 ...
- TOMCAT启动完成但是ECLIPSE仍然显示starting....
最近重新部署了一个TOMCAT服务,但是启动碰到个问题,虽然TOMCAT控制台已显示启动成功,但是ECLIPSE右下角仍然一直显示STARTING,最后TOMCAT超时,启动失败. 之前以为是拷贝工程 ...