[LA3523/uva10195]圆桌骑士 tarjan点双连通分量+奇环定理+二分图判定


1.一个环上的各点必定在同一个点双连通分量内;
2.如果一个点双连通分量是二分图,就不可能有奇环;
最基本的二分图中的一个环:
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<iostream>
#include<queue>
#include<vector>
using namespace std; const int N=,M=;
int n,m,len,num,sl,tl,cnt;
int first[N],hate[N][N],dfn[N],low[N],s[N],t[N],col[N];
bool single[N],in[N];
struct node{
int x,y,next;
}a[*M];
int minn(int x,int y){return x<y ? x:y;} void ins(int x,int y)
{
len++;
a[len].x=x;a[len].y=y;
a[len].next=first[x];first[x]=len;
} bool check(int x)
{
for(int i=first[x];i;i=a[i].next)
{
int y=a[i].y;
if(!in[y]) continue;
if(col[y]==-)
{
col[y]=-col[x];
if(!check(y)) return ;
}
if(col[y]==col[x]) return ;
}
return ;
} void tarjan(int x,int fa)
{
dfn[x]=low[x]=++num;
s[++sl]=x;
for(int i=first[x];i;i=a[i].next)
{
int y=a[i].y;
if(y==fa) continue;
if(!dfn[y])
{
tarjan(y,x);
low[x]=minn(low[x],low[y]);
if(low[y]>=dfn[x])
{
int z=s[sl];
cnt++;
tl=;t[++tl]=z;in[z]=;
while(z!=x)
{
sl--;
z=s[sl];
in[z]=;t[++tl]=z;
}
col[x]=;
bool bk=check(x);
for(int j=;j<=tl;j++)
{
in[t[j]]=;col[t[j]]=-;
if(!bk) single[t[j]]=;
}
}
}
else low[x]=minn(low[x],dfn[y]);
}
} int main()
{
while()
{
scanf("%d%d",&n,&m);
if(!n && !m) return ;
len=;num=;sl=;cnt=;
memset(first,,sizeof(first));
memset(dfn,,sizeof(dfn));
memset(hate,,sizeof(hate));
memset(single,,sizeof(single));
memset(col,-,sizeof(col));
memset(in,,sizeof(in));
for(int i=;i<=m;i++)
{
int x,y;
scanf("%d%d",&x,&y);
hate[x][y]=;
hate[y][x]=;
}
for(int i=;i<=n;i++)
for(int j=;j<=n;j++)
if(i!=j && !hate[i][j]) ins(i,j);
for(int i=;i<=n;i++) if(!dfn[i]) tarjan(i,);
int ans=;
for(int i=;i<=n;i++) if(single[i]) ans++;
printf("%d\n",ans);
}
return ;
}
[LA3523/uva10195]圆桌骑士 tarjan点双连通分量+奇环定理+二分图判定的更多相关文章
- UVALive 3523 Knights of the Round Table 圆桌骑士 (无向图点双连通分量)
由于互相憎恨的骑士不能相邻,把可以相邻的骑士连上无向边,会议要求是奇数,问题就是求不在任意一个简单奇圈上的结点个数. 如果不是二分图,一定存在一个奇圈,同一个双连通分量中其它点一定可以加入奇圈.很明显 ...
- 【Codefoces487E/UOJ#30】Tourists Tarjan 点双连通分量 + 树链剖分
E. Tourists time limit per test: 2 seconds memory limit per test: 256 megabytes input: standard inpu ...
- POJ 3177 Redundant Paths (tarjan边双连通分量)
题目连接:http://poj.org/problem?id=3177 题目大意是给定一些牧场,牧场和牧场之间可能存在道路相连,要求从一个牧场到另一个牧场要有至少两条以上不同的路径,且路径的每条pat ...
- codeforces 962F.simple cycle(tarjan/点双连通分量)
题目连接:http://codeforces.com/contest/962/problem/F 题目大意是定义一个simple cycle为从一个节点开始绕环走一遍能经过simple cycle内任 ...
- POJ2942 Knights of the Round Table【Tarjan点双联通分量】【二分图染色】【补图】
LINK 题目大意 有一群人,其中有一些人之间有矛盾,现在要求选出一些人形成一个环,这个环要满足如下条件: 1.人数大于1 2.总人数是奇数 3.有矛盾的人不能相邻 问有多少人不能和任何人形成任何的环 ...
- 【BZOJ-1123】BLO Tarjan 点双连通分量
1123: [POI2008]BLO Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 970 Solved: 408[Submit][Status][ ...
- 图连通性【tarjan点双连通分量、边双联通分量】【无向图】
根据 李煜东大牛:图连通性若干拓展问题探讨 ppt学习. 有割点不一定有割边,有割边不一定有割点. 理解low[u]的定义很重要. 1.无向图求割点.点双联通分量: 如果对一条边(x,y),如果low ...
- tarjan 边双连通分量 对点进行分组 每组点都在一个双连通分量里边
int dfn[N],low[N],id[N],s[N],p,num,t,son[N];//dfn记录dfs时间戳//low代表当前点到达的最小时间戳,id对点进行分组编号.num是时间戳//s临时存 ...
- 【LA3523 训练指南】圆桌骑士 【双连通分量】
题意 有n个骑士经常举行圆桌会议,商讨大事.每次圆桌会议至少应有3个骑士参加,且相互憎恨的骑士不能坐在圆桌旁的相邻位置.如果发生意见分歧,则需要举手表决,因此参加会议的骑士数目必须是奇数,以防赞同和反 ...
随机推荐
- Ubuntu录制gif动态图
大神写博客的时候通常一个Demo会附带一个动态图展示效果.在windows和mac上应该很容易找到录制工具,下面记录一下我在ubuntu下录制gif的过程. 下载byzanz录制工具 在ubuntu软 ...
- erlang+thrift配合开发
I think, thrift is a tcp/ip based Client-Server architecture multi-languages supported RPC framewo ...
- 3dContactPointAnnotationTool开发日志(十)
要是那几个状态栏不能拖动的话岂不是显得太呆板了,于是我又参考Unity官方视频教程学习了如何实现拖动状态栏的功能,还挺简单的. 比如说要拖动这个PanelStatus面板,我只让使用者通过拖动 ...
- cURL和file_get_contents实现模拟post请求
以前面试时候,面试官问过我后端有没有跨域问题,但是不敢肯定,现在可以肯定的说没有. 不文用php的cURL和file_get_contents方法分别实现后端跨域.本文场景也是在tp5下实现的. 一, ...
- 【Linux】- Ubutnu UFW防火墙的简单设置
ufw是一个主机端的iptables类防火墙配置工具,比较容易上手.一般桌面应用使用ufw已经可以满足要求了. 安装方法 sudo apt-get install ufw 使用方法 1.启用: sud ...
- 升级到EFCore2.0
EF Core 2.0上周已经发布了 文章内容基于vs2017,请大家先安装好vs2017(15.3). 本篇文章主要讲下差异点,跟之前一样的就不再重复了. 文章目录(差异点): 一.新建项目, EF ...
- CS6的安装与破解
大家在Mac下肯定也少不了对图片进行修改,那也就少不了Photoshop这款软件. 今天在这里分享下苹果下的Adobe PhotoshopCS6,这个软件大家应该都很熟悉,主要功能什么我就不多做介绍了 ...
- Devc++编译系统分配给int多少字节
我看的是<C语言程序设计>..谭浩强的PDF版 里面只讲了VC和TC 的,没有Devc++的..(我的是5.10版) 还有这是什么意思? 经过查阅我进行了这样的测试: 得到了这样的结果: ...
- JS内存空间详细图解
JS内存空间详细图解 变量对象与堆内存 var a = 20; var b = 'abc'; var c = true; var d = { m: 20 } 因为JavaScript具有自动垃圾回收机 ...
- [JSOI2010]部落划分 最小生成树
一道最小生成树经典题 由于是最靠近的两个部落尽可能远,如果我们先处理出任意两个居住点之间的距离并将其当做边,那么我们可以发现,因为在一个部落里面的边是不用计入答案的,所以应该要尽量把小边放在一个部落里 ...