POJ2942:Knights of the Round Table——题解
http://poj.org/problem?id=2942
所写的tarjan练习题最难的一道。
说白了难在考得不是纯tarjan。
首先我们把仇恨关系处理成非仇恨关系的图,然后找双连通分量,在双连通分量里的点满足了任意一个人可以和两个(或以上)的人坐一起。
那么我们接下来要判断奇环。
发现性质:如果一个双连通分量有奇环,那么其中任意一点一定在某个奇环上。
也就是说,这些人拼一拼绝对能全部开会成功,我们把他们打上成功标志。
然后搜失败标志的人的个数即可。
判断奇环的方法显然二分图染色。
#include<stack>
#include<cstdio>
#include<cstring>
#include<vector>
#include<iostream>
#include<algorithm>
using namespace std;
typedef long long ll;
inline int read(){
int x=,w=;char ch=;
while(ch<''||ch>''){if(ch=='-')w=-;ch=getchar();}
while(ch>=''&&ch<=''){x=(x<<)+(x<<)+ch-'';ch=getchar();}
return x*w;
}
const int maxn=;
struct node{
int st;
int to;
int nxt;
}edge[];
int cnt,head[maxn];
void add(int u,int v){
cnt++;
edge[cnt].st=u;
edge[cnt].to=v;
edge[cnt].nxt=head[u];
head[u]=cnt;
return;
}
bool dis[maxn][maxn];
bool ok[maxn];
int color[maxn];
int dfn[maxn];
int low[maxn];
bool inslt[maxn];
int t=;
int n,m;
int numslt[maxn];
stack<int>q;
vector<int>slt[maxn];
int slt_cnt;
void tarjan(int u,int f){
t++;
dfn[u]=t;
low[u]=t;
for(int i=head[u];i;i=edge[i].nxt){
int v=edge[i].to;
if(!dfn[v]){
q.push(i);
tarjan(v,u);
low[u]=min(low[u],low[v]);
if(low[v]>=dfn[u]){
slt_cnt++;
slt[slt_cnt].clear();
while(){
int num=q.top();
q.pop();
if(numslt[edge[num].st]!=slt_cnt){
numslt[edge[num].st]=slt_cnt;
slt[slt_cnt].push_back(edge[num].st);
}
if(numslt[edge[num].to]!=slt_cnt){
numslt[edge[num].to]=slt_cnt;
slt[slt_cnt].push_back(edge[num].to);
}
if(edge[num].to==v&&edge[num].st==u)break;
}
}
}else if(f!=v){
if(low[u]>dfn[v]){
q.push(i);
low[u]=dfn[v];
}
}
}
return;
}
bool draw(int u){
bool ret=;
for(int i=head[u];i;i=edge[i].nxt){
int v=edge[i].to;
if(!inslt[v])continue;
if(color[v]==-){
color[v]=-color[u];
ret|=draw(v);
}else if(color[v]==color[u]){
return ;
}
}
return ret;
}
void clr(){
cnt=;slt_cnt=;
while(!q.empty())q.pop();
memset(dfn,,sizeof(dfn));
memset(low,,sizeof(low));
memset(numslt,,sizeof(numslt));
memset(head,,sizeof(head));
memset(dis,,sizeof(dis));
memset(ok,,sizeof(ok));
return;
}
int main(){
n=read();
m=read();
while(n||m){
clr();
for(int i=;i<=m;i++){
int u=read();
int v=read();
dis[u][v]=dis[v][u]=;
}
for(int i=;i<=n;i++){
for(int j=i+;j<=n;j++){
if(!dis[i][j]){
add(i,j);
add(j,i);
}
}
}
for(int i=;i<=n;i++){
if(!dfn[i]){
tarjan(i,);
}
}
for(int i=;i<=slt_cnt;i++){
memset(inslt,,sizeof(inslt));
memset(color,-,sizeof(color));
int u;
for(int j=;j<slt[i].size();j++){
u=slt[i][j];
inslt[u]=;
}
color[u]=;
if(draw(u)){
for(int j=;j<slt[i].size();j++){
u=slt[i][j];
ok[u]=;
}
}
}
int ans=;
for(int i=;i<=n;i++)if(!ok[i])ans++;
printf("%d\n",ans);
n=read();m=read();
}
return ;
}
POJ2942:Knights of the Round Table——题解的更多相关文章
- 「题解」:[POJ2942]Knights of the Round Table
问题 E: Knights of the Round Table 时间限制: 1 Sec 内存限制: 256 MB 题面 题目描述 作为一名骑士是一个非常有吸引力的职业:寻找圣杯,拯救遇难的少女,与 ...
- POJ2942 Knights of the Round Table[点双连通分量|二分图染色|补图]
Knights of the Round Table Time Limit: 7000MS Memory Limit: 65536K Total Submissions: 12439 Acce ...
- poj2942 Knights of the Round Table 双连通分支 tarjan
题解:http://blog.csdn.net/lyy289065406/article/details/6756821 讲的很详细我就不多说了. 题目连接:http://poj.org/proble ...
- POJ2942 Knights of the Round Table 点双连通分量,逆图,奇圈
题目链接: poj2942 题意: 有n个人,能够开多场圆桌会议 这n个人中,有m对人有仇视的关系,相互仇视的两人坐在相邻的位置 且每场圆桌会议的人数仅仅能为奇书 问有多少人不能參加 解题思路: 首先 ...
- [POJ2942]:Knights of the Round Table(塔尖+二分图染色法)
题目传送门 题目描述 亚瑟王要在圆桌上召开骑士会议,为了不引发骑士之间的冲突,并且能够让会议的议题有令人满意的结果,每次开会前都必须对出席会议的骑士有如下要求: .相互憎恨的两个骑士不能坐在直接相邻的 ...
- POJ2942:Knights of the Round Table
传送门 点双练习. 很简单的一道模板题,建立反图,求出点双,二分图判定奇环. //POJ 2942 //by Cydiater //2016.11.2 #include <iostream> ...
- POJ2942 Knights of the Round Table(点双连通分量 + 二分图染色)
题目大概说要让n个骑士坐成一圈,这一圈的人数要是奇数且大于2,此外有些骑士之间有仇恨不能坐在一起,问有多少个骑士不能入座. 双连通图上任意两点间都有两条不重复点的路径,即一个环.那么,把骑士看做点,相 ...
- poj2942 Knights of the Round Table,无向图点双联通,二分图判定
点击打开链接 无向图点双联通.二分图判定 <span style="font-size:18px;">#include <cstdio> #include ...
- POJ2942 Knights of the Round Table【Tarjan点双联通分量】【二分图染色】【补图】
LINK 题目大意 有一群人,其中有一些人之间有矛盾,现在要求选出一些人形成一个环,这个环要满足如下条件: 1.人数大于1 2.总人数是奇数 3.有矛盾的人不能相邻 问有多少人不能和任何人形成任何的环 ...
随机推荐
- autocomplete.jquery 点击或进入默认显示所有结果
注意使用的是autocomplete.jquery,官网地址是:https://github.com/devbridge/jQuery-Autocomplete.而不是JqueryUI的autocom ...
- jmeter "you cannot switch bacause data cannot be converted to target Tab data,empty data to switch"报错
jmeter "you cannot switch bacause data cannot be converted to target Tab data,empty data to swi ...
- 打印队列 (Printer Queue,ACM/ICPC NWERC 2006,UVA12100)
题目描述: 题目思路: 使用一个队列记录数字,一个优先队列记录优先级,如果相等即可打印: #include <iostream> #include <queue> using ...
- 【转载】IOS之禁用UIWebView的默认交互行为
原文地址 :IOS之禁用UIWebView的默认交互行为 http://my.oschina.net/hmj/blog/111344 UIKit提供UIWebView组件,允许开发者在App中嵌入We ...
- Docker容器的搭建
Docker容器的搭建 一.先从Docker Hub上面拉取一个基础镜像 命令:docker pull ubuntu 命令说明:pull:拉取镜像的命令,ubuntu:拉取镜像的名称 扩展命令: 命令 ...
- 收割大厂offer需要具备的条件
转载出处 本人也一直在关注互联网,觉得还是有些了解.互联网要求是越来越高了,竞争的人太多了,不过你不用担心,个人觉得,你到了中层的水平,拿二线offer应该没问题,人多也有人多的好处,我比别人多努力一 ...
- Eclipse 安装SVN、Maven插件
1先安装subeclipse插件就是svn svn - http://subclipse.tigris.org/update_1.6.x 我这里是灰色的说明我安装过了这里只是截图说明下,我就不继续安装 ...
- PHP 5.6.32 增加pdo_dblib.so拓展
首先说明,php增加pdo_dblib.so拓展不需要重新编译php源文件,只需要增加dblib源包即可. 1.下载安装所需包 1.#下载 wget http://mirrors.ibiblio.or ...
- Thunder团队——文案+美工
团队名称:Thunder 组长:王航 成员:李传康.代秋彤.邹双黛.苗威.宋雨.胡佑蓉.杨梓瑞 项目名称:爱阅app 需求概述: 现在市面上有很多手机阅读器,但是基本上不是收费就是广告满天飞.基于这种 ...
- Android 网络编程 API笔记 - java.net 包相关 接口 api
Android 网络编程相关的包 : 9 包, 20 接口, 103 类, 6 枚举, 14异常; -- Java包 : java.net 包 (6接口, 34类, 2枚举, 12异常); -- An ...