http://blog.csdn.net/lyy289065406/article/details/6756821
http://www.cnblogs.com/wuyiqi/archive/2011/10/19/2217911.html #include "stdio.h"
#include "string.h" #define N 1010 int time;
int n,m;
bool map[N][N]; struct node
{
int x,y;
//int weight;
bool visit; //用来标记该边是否已经访问
int next;
}edge[2*N*N];
int idx,head[N]; bool odd[N];
bool mark[N]; //标记点是否为当前双连通分量中的元素
int low[N],dfn[N];
int st[N*N],top; //模拟栈
int col[N]; void Read_date();
inline int MIN(int a,int b) { return a<b?a:b; }
void Init(){ idx=0; memset(head,-1,sizeof(head)); }
void Add(int x,int y)
{
edge[idx].x = x;
edge[idx].y = y;
edge[idx].visit = false;
edge[idx].next = head[x];
head[x] = idx++;
} bool find(int x) //判断当前双连通分量是否为二分图
{
int i,y;
for(i=head[x]; i!=-1; i=edge[i].next)
{
y = edge[i].y;
if(mark[y])
{
if(col[y]==-1)
{
col[y] = !col[x];
return find(y);
}
else if(col[y]==col[x])
return false; //不是二分图,返回false
}
}
return true; //是二分图,返回true
} void Color(int x)
{
int i;
memset(mark,false,sizeof(mark));
while(1)
{
i = st[top];
top--;
mark[edge[i].x] = true;
mark[edge[i].y] = true;
if(edge[i].x==x) break;
}
memset(col,-1,sizeof(col));
col[x] = 0;
if(!find(x)) //双连通分量不是二分图,则这些点全部可以
{
for(i=1; i<=n; ++i)
{
if(mark[i])
odd[i] = 1;
}
}
} void DFS(int x)
{
int i,y;
low[x] = dfn[x] = ++time;
for(i=head[x]; i!=-1; i=edge[i].next)
{
y = edge[i].y;
if(edge[i].visit) continue;
edge[i].visit = edge[i^1].visit = 1;//走过的边不能再走了
st[++top] = i;
if(!dfn[y])
{
DFS(y);
low[x] = MIN(low[x],low[y]);
if(low[y]>=dfn[x]) //找到割顶或者为根节点
Color(x);
}
else
low[x] = MIN(low[x],dfn[y]);
}
} int Solve()
{
int i;
int num=0;
time = 0;
top = 0;
memset(dfn,0,sizeof(dfn));
memset(odd,false,sizeof(odd));
for(i=1; i<=n; ++i)
{
if(!dfn[i]) //表示点i未被访问过
DFS(i); //以i为根节点找双连通分量
}
for(i=1; i<=n; ++i)
{
if(!odd[i])
num++;
}
return num;
} int main()
{
while(scanf("%d%d",&n,&m),n||m)
{
Read_date();
printf("%d\n",Solve());
}
return 0;
} void Read_date()
{
int i,j;
int x,y;
memset(map,true,sizeof(map));
while(m--)
{
scanf("%d %d",&x,&y);
map[x][y] = map[y][x] = false;
}
Init();
for(i=1; i<=n; ++i)
{
for(j=i+1; j<=n; ++j)
{
if(map[i][j])
{
Add(i,j);
Add(j,i);
}
}
}
}

poj 2942 求点双联通+二分图判断奇偶环+交叉染色法判断二分图的更多相关文章

  1. 【交叉染色法判断二分图】Claw Decomposition UVA - 11396

    题目链接:https://cn.vjudge.net/contest/209473#problem/C 先谈一下二分图相关: 一个图是二分图的充分必要条件: 该图对应无向图的所有回路必定是偶环(构成该 ...

  2. UVA - 10004 Bicoloring(判断二分图——交叉染色法 / 带权并查集)

    d.给定一个图,判断是不是二分图. s.可以交叉染色,就是二分图:否则,不是. 另外,此题中的图是强连通图,即任意两点可达,从而dfs方法从一个点出发就能遍历整个图了. 如果不能保证从一个点出发可以遍 ...

  3. POJ 2942 Knights of the Round Table 补图+tarjan求点双联通分量+二分图染色+debug

    题面还好,就不描述了 重点说题解: 由于仇恨关系不好处理,所以可以搞补图存不仇恨关系, 如果一个桌子上面的人能坐到一起,显然他们满足能构成一个环 所以跑点双联通分量 求点双联通分量我用的是向栈中pus ...

  4. POJ 3694Network(Tarjan边双联通分量 + 缩点 + LCA并查集维护)

    [题意]: 有N个结点M条边的图,有Q次操作,每次操作在点x, y之间加一条边,加完E(x, y)后还有几个桥(割边),每次操作会累积,影响下一次操作. [思路]: 先用Tarjan求出一开始总的桥的 ...

  5. Wrestling Match---hdu5971(2016CCPC大连 染色法判断是否是二分图)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5971 题意:有n个人,编号为1-n, 已知X个人是good,Y个人是bad,m场比赛,每场比赛都有一个 ...

  6. 染色法判断是否是二分图 hdu2444

    用染色法判断二分图是这样进行的,随便选择一个点, 1.把它染成黑色,然后将它相邻的点染成白色,然后入队列 2.出队列,与这个点相邻的点染成相反的颜色 根据二分图的特性,相同集合内的点颜色是相同的,即 ...

  7. Catch---hdu3478(染色法判断是否含有奇环)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3478 题意:有n个路口,m条街,一小偷某一时刻从路口 s 开始逃跑,下一时刻都跑沿着街跑到另一路口,问 ...

  8. poj 3177&&3352 求边双联通分量,先求桥,然后求分量( 临界表代码)

    /*这道题是没有重边的,求加几条边构成双联通,求边联通分量,先求出桥然后缩点,成一个棵树 找叶子节点的个数*/ #include<stdio.h>//用容器写在3177这个题上会超内存,但 ...

  9. POJ 3177 Redundant Paths 双联通分量 割边

    http://poj.org/problem?id=3177 这个妹妹我大概也曾见过的~~~我似乎还没写过双联通分量的blog,真是智障. 最少需要添多少条边才能使这个图没有割边. 边双缩点后图变成一 ...

随机推荐

  1. 禁止root用户直接远程telnet/ssh登陆

    AIX 封闭root,只能使用su登录root用户,禁止root用户直接远程登陆. 1.  禁止telnet登录 smit chuser   ->root       ->User can ...

  2. C/C++大小端模式与位域

    一.大端小端: 1.大端:指数据的高字节保存在内存的低地址中,而数据的低字节保存在内存的高地址中 例如:0x12345678 在内存中的存储为  : 0x0000 0x0001 0x0002 0x00 ...

  3. C# winform listBox中的项上下移动(转)

    C# winform listBox中的项上下移动 分类: C# winform2009-06-24 12:37 876人阅读 评论(0) 收藏 举报 winformc#object //上移节点   ...

  4. Sqlserver 数据库恢复常见错误及解决(网站转载 留着备用)

    数据库恢复常见错误及解决 2009-04-13 11:25 1145人阅读 评论(0) 收藏 举报 数据库databasesqlserverusermicrosoftsql server 在sqlSe ...

  5. MVC微信浏览器图片上传(img转Base64)

    因公司业务需要,需要做一个微信公众号里的图片上传功能,主要用到的技术就是 img转base64 上到服务器 话不多说, 贴代码 先看前端显示出来的东西 OK 图片不重要,看代码 <!--微信图片 ...

  6. 使用TortoiseSVN碰到的几个问题(2)-冲突解决, 图标重载

    8)解决冲突 冲突分为两种:文件冲突---当两名(或更多)开发人员修改了同一个文件中相邻或相同的行时就会发生文件冲突.下面的属性冲突应该也属于文件冲突. 树冲突---当一名开发人员移动.重命名.删除一 ...

  7. 易企CMS仿站标签说明

    头部标签: 每个页面都必须加的三大标签(将标签放入header.tpl里面,这样只需在每个模板中调用header.tpl即可): <title>{$seotitle}_{$sitename ...

  8. python--1、入门

    python的创始人为吉多·范罗苏姆(Guido van Rossum). python在2017年统计的所有语言排名中处于第四名,稳步上升状态. python应用领域: WEB开发(Django框架 ...

  9. Android媒体解码MediaCodec MediaExtractor学习

    Android提供了MediaPlayer播放器播放媒体文件,其实MediaPlyer只是对Android Media包下的MediaCodec和MediaExtractor进行了包装,方便使用.但是 ...

  10. 创建dml触发器

    -实现删除学生信息时把该学生的成绩记录全部清空 --判断触发器是否存在 if exists(select * from sysobjects where name = 'delete_student' ...