poj2942 求v-DCC,二分图判奇环,补图
/*
给定一张无向图,求有多少点不被任何奇环包含
推论1:如果两个点属于两个不同的v-DCC,则他们不可能在同一个奇环内
推论2:某个v-DCC中有奇环,则这个v-DCC中所有点必定被属于某个奇环
只要求出补图中的所有v-DCC,判定每个v-DCC中是否存在奇环即可
如果某个v-DCC中包含奇环,则该联通块的所有点都被标记位1
最后只要求未被标记的点数量即可
*/
#include<iostream>
#include<cstring>
#include<cstdio>
using namespace std;
#define maxn 1005
int mp[maxn][maxn];
struct Edge{int to,nxt;}edge[];
int head[maxn],tot,n,m; void addedge(int u,int v){
edge[tot].to=v;edge[tot].nxt=head[u];head[u]=tot++;
} int ind,top,low[maxn],dfn[maxn],stack[maxn],flag[maxn],color[maxn],tmp[maxn],cnt;
int ok[maxn];//判断i是否在联通分量里
int dfs(int x,int col){//不能成功染色就返回0
color[x]=col;
for(int i=head[x];i!=-;i=edge[i].nxt){
int y=edge[i].to;
if(ok[y]==)continue;
if(color[y]!=-){//已经被染色过的点
if(color[y]==col)
return false;
continue;
}
if(!dfs(y,col^))
return false;
}
return true;
}
void Tarjan(int x){
dfn[x]=low[x]=++ind;
stack[++top]=x;
for(int i=head[x];i!=-;i=edge[i].nxt){
int y=edge[i].to;
if(!dfn[y]){
Tarjan(y);
low[x]=min(low[x],low[y]);
if(dfn[x]<=low[y]){//找到一个点双联通分量
int z;
cnt=;
memset(ok,,sizeof ok);
do{
z=stack[top--];
tmp[++cnt]=z;
ok[z]=;
}while(z!=y);
tmp[++cnt]=x;
//tmp数组中存点双联通分量
//开始判定奇环
memset(color,-,sizeof color);
ok[x]=;
if(!dfs(x,)){//如果v_DCC中有奇环
flag[x]=;
while(cnt--)
flag[tmp[cnt]]=;
}
}
}
else low[x]=min(low[x],dfn[y]);
}
}
void init(){
tot=ind=top=;
memset(head,-,sizeof head);
memset(low,,sizeof low);
memset(dfn,,sizeof dfn);
memset(flag,,sizeof flag);
memset(mp,,sizeof mp);
}
int main(){
while(cin>>n>>m,n){
init();
int u,v;
while(m--){
scanf("%d%d",&u,&v);
mp[u][v]=mp[v][u]=;
}
//建立补图
for(int i=;i<n;i++)
for(int j=i+;j<=n;j++)
if(mp[i][j]==)
addedge(i,j),addedge(j,i);
for(int i=;i<=n;i++)
if(dfn[i]==)
Tarjan(i);
int ans=n;
for(int i=;i<=n;i++)
if(flag[i])ans--;
cout<<ans<<endl;
}
}
poj2942 求v-DCC,二分图判奇环,补图的更多相关文章
- 【POJ 2942】Knights of the Round Table(双联通分量+染色判奇环)
[POJ 2942]Knights of the Round Table(双联通分量+染色判奇环) Time Limit: 7000MS Memory Limit: 65536K Total Su ...
- HDU - 3478 Catch(判奇环/二分图)
http://acm.hdu.edu.cn/showproblem.php?pid=3478 题意 给一个无向图和小偷的起点,小偷每秒可以向相邻的点出发,问有没有一个时间点小偷可能出现在任何点. 分析 ...
- FZU2181+poj2942(点双连通+判奇圈)
分析:我们对于那些相互不憎恨的人连边,将每次参加会议的所有人(不一定是全部人,只需人数>=3且为奇数)看做一个点双联通分量,那么每个点都至少有两个点与他相邻.即需要保证双联通分量中存在奇圈.至于 ...
- HDU-5215 Cycle 无向图判奇环偶环
题意:给一个无向图,判断这个图是否存在奇环和偶环. 解法:网上有一种只用dfs就能做的解法,但是我不太理解. 这里用的是比较复杂的.首先奇环很简单可以用二分图染色判断.问题是偶环怎么判断?这里我们想, ...
- HDU3478 【判奇环/二分图的性质】
题意: 给你一幅图,给你一个起点,然后问你存不存在一个时刻,所有点可以在那个时刻到达. 思路: 这幅图首先是联通的: 如果出现奇数环,则满足在某一时刻都可能到达: 然后判断奇数环用二分图性质搞也是神奇 ...
- UVA 11090 Going in Cycle!!(二分答案+判负环)
在加权有向图中求平均权值最小的回路. 一上手没有思路,看到“回路”,第一想法就是找连通分量,可又是加权图,没什么好思路,那就转换题意:由求回路权值->判负环,求最小值->常用二分答案. 二 ...
- [cf557d]Vitaly and Cycle(黑白染色求奇环)
题目大意:给出一个 n 点 m 边的图,问最少加多少边使其能够存在奇环,加最少边的情况数有多少种. 解题关键:黑白染色求奇环,利用数量分析求解. 奇环:含有奇数个点的环. 二分图不存在奇环.反之亦成立 ...
- HDU 4514 - 湫湫系列故事——设计风景线 - [并查集判无向图环][树形DP求树的直径]
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4514 Time Limit: 6000/3000 MS (Java/Others) Memory Li ...
- cf19E. Fairy(奇环 二分图染色)
题意 题目链接 Sol 非常有思维含量的一道题,队爷的论文里介绍了一种\(N \sqrt{N}\)的暴力然鹅看不懂.. 看了一下clj的\(O(nlogn)\)的题解,又翻了翻题交记录,发现\(O(n ...
随机推荐
- 剑指Offer-滑动窗口的最大值
题目描述 给定一个数组和滑动窗口的大小,找出所有滑动窗口里数值的最大值.例如,如果输入数组{2,3,4,2,6,2,5,1}及滑动窗口的大小3,那么一共存在6个滑动窗口,他们的最大值分别为{4,4,6 ...
- ES学习
官方参考手册 https://www.elastic.co/guide/en/elasticsearch/reference/5.6/index.html https://www.elastic.co ...
- 【tmos】mvn package相关知识点(待补充...)
SpringBoot项目打包跳过测试 <build> <plugins> <plugin> <groupId>org.springframework.b ...
- linux把文件压缩成.tar.gz的命令
https://blog.csdn.net/qq_27803491/article/details/52785838
- python - 练习统计随机字母数据
# 随机字母,统计每个字母的数量: # 1.按a-z 的方式 显示每个字母的数量 # 2.按从多到少的方式 显示每个字母的数据 info= "fkdsfkasefhjsadfjagroekl ...
- CSS 模块的侦测
CSS 的规格发展太快,新的模块层出不穷.不同浏览器的不同版本,对 CSS 模块的支持情况都不一样.有时候,需要知道当前浏览器是否支持某个模块,这就叫做“CSS模块的侦测”. 一个比较普遍适用的方法是 ...
- MySql 在cmd下的学习笔记 —— 有关多表查询的操作(内连接,外连接,交叉连接)
mysql> create table test5( -> id int, ) -> )engine myisam charset utf8; Query OK, rows affe ...
- SQL操作json类型数据的函数
MySQL5.7之后对json数据格式进行了函数支持 Json_contains(字段名, '值') 1.表中json格式的某个字段 2.json里的某个键值 Json_search(字段名, 'on ...
- 【Convex Optimization (by Boyd) 学习笔记】Chapter 2 - Convex sets(1) 仿射集&凸集
I. 仿射凸集(Affine and convex sets) 1. 线与线段 假设\(R^n\)空间内两点\(x_1,x_2\, (x_1≠x_2)\),那么\(y=\theta x_1+(1-\t ...
- hibernate 嵌套事务
hibernate 嵌套事务,多线程调试.问题麻烦啊,后续有时间补全.