/*
给定一张无向图,求有多少点不被任何奇环包含
推论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,二分图判奇环,补图的更多相关文章

  1. 【POJ 2942】Knights of the Round Table(双联通分量+染色判奇环)

    [POJ 2942]Knights of the Round Table(双联通分量+染色判奇环) Time Limit: 7000MS   Memory Limit: 65536K Total Su ...

  2. HDU - 3478 Catch(判奇环/二分图)

    http://acm.hdu.edu.cn/showproblem.php?pid=3478 题意 给一个无向图和小偷的起点,小偷每秒可以向相邻的点出发,问有没有一个时间点小偷可能出现在任何点. 分析 ...

  3. FZU2181+poj2942(点双连通+判奇圈)

    分析:我们对于那些相互不憎恨的人连边,将每次参加会议的所有人(不一定是全部人,只需人数>=3且为奇数)看做一个点双联通分量,那么每个点都至少有两个点与他相邻.即需要保证双联通分量中存在奇圈.至于 ...

  4. HDU-5215 Cycle 无向图判奇环偶环

    题意:给一个无向图,判断这个图是否存在奇环和偶环. 解法:网上有一种只用dfs就能做的解法,但是我不太理解. 这里用的是比较复杂的.首先奇环很简单可以用二分图染色判断.问题是偶环怎么判断?这里我们想, ...

  5. HDU3478 【判奇环/二分图的性质】

    题意: 给你一幅图,给你一个起点,然后问你存不存在一个时刻,所有点可以在那个时刻到达. 思路: 这幅图首先是联通的: 如果出现奇数环,则满足在某一时刻都可能到达: 然后判断奇数环用二分图性质搞也是神奇 ...

  6. UVA 11090 Going in Cycle!!(二分答案+判负环)

    在加权有向图中求平均权值最小的回路. 一上手没有思路,看到“回路”,第一想法就是找连通分量,可又是加权图,没什么好思路,那就转换题意:由求回路权值->判负环,求最小值->常用二分答案. 二 ...

  7. [cf557d]Vitaly and Cycle(黑白染色求奇环)

    题目大意:给出一个 n 点 m 边的图,问最少加多少边使其能够存在奇环,加最少边的情况数有多少种. 解题关键:黑白染色求奇环,利用数量分析求解. 奇环:含有奇数个点的环. 二分图不存在奇环.反之亦成立 ...

  8. HDU 4514 - 湫湫系列故事——设计风景线 - [并查集判无向图环][树形DP求树的直径]

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4514 Time Limit: 6000/3000 MS (Java/Others) Memory Li ...

  9. cf19E. Fairy(奇环 二分图染色)

    题意 题目链接 Sol 非常有思维含量的一道题,队爷的论文里介绍了一种\(N \sqrt{N}\)的暴力然鹅看不懂.. 看了一下clj的\(O(nlogn)\)的题解,又翻了翻题交记录,发现\(O(n ...

随机推荐

  1. P1494 [国家集训队]小Z的袜子(莫队)

    题目链接:https://www.luogu.org/problemnew/show/P1494 题目大意:中文题目 具体思路:计算概率的时候,每一次是区间的移动,每一次移动,记得先将原来的记录的影响 ...

  2. Content-disposition中Attachment和inline的区别

    1.Content-disposition中Attachment和inline的区别java web中下载文件时,我们一般设置Content-Disposition告诉浏览器下载文件的名称,是否在浏览 ...

  3. Jedis(java操作redis数据库技术)

    Redis有什么命令,Jedis就有什么方法. 客户端无法连接时,需要考虑防火墙配置,比如6379端口是否开放,也可以直接关闭防火墙. Jedis连接池: import org.junit.Test; ...

  4. 20165237 2017-2018-2 《Java程序设计》第6周学习总结

    20165237 2017-2018-2 <Java程序设计>第6周学习总结 教材学习内容总结 1.String类的常用方法: public int length() public boo ...

  5. codevs 1080 线段树练习(线段树)

    题目: 题目描述 Description 一行N个方格,开始每个格子里都有一个整数.现在动态地提出一些问题和修改:提问的形式是求某一个特定的子区间[a,b]中所有元素的和:修改的规则是指定某一个格子x ...

  6. 【转】Python之mmap内存映射模块(大文本处理)说明

    [转]Python之mmap内存映射模块(大文本处理)说明 背景: 通常在UNIX下面处理文本文件的方法是sed.awk等shell命令,对于处理大文件受CPU,IO等因素影响,对服务器也有一定的压力 ...

  7. Keepalived详解(五):Keepalived集群中MASTER和BACKUP角色选举策略【转】

    一.Keepalived集群中MASTER和BACKUP角色选举策略 在keepalived集群中,其实并没有严格意义上的主.备节点,虽然可以在keepalived配置文件中设置state选项为MAS ...

  8. lzstring

    import lzstring ic = {"name": "root", "password": "123456"} ...

  9. Redis 通过 info 查看信息和状态

    INFO INFO [section] 以一种易于解释(parse)且易于阅读的格式,返回关于 Redis 服务器的各种信息和统计数值. 通过给定可选的参数 section ,可以让命令只返回某一部分 ...

  10. Awk 命令学习总结、AWk命令系列学习(linux shell)

    AWK基本语法 下面没有提到awk命令怎么使用了,你可以通过 运行:awk –h 查询到所有命令及参数!下面把awk作为一门语言分节介绍. linux awk 内置变量使用介绍   awk语言中,怎么 ...