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. 洛谷 P3112 后卫马克 —— 状压DP

    题目:https://www.luogu.org/problemnew/show/P3112 状压DP...转移不错. 代码如下: #include<iostream> #include& ...

  2. Drainage Ditches(网络流(EK算法))

    计算最大流,EK算法模板题. #include <stdio.h> #include <string.h> #include <queue> using names ...

  3. ride关键字

    定义变量:set variable 打印 :log 列表:create list 字符转数字型:evaluate 随机数:evaluate random.randint 日志截图:先导入screens ...

  4. 想要学好C/C++,我到底要看多少书才能成为一个合格的C/C++工程师?

    如何学好C语言 这可能是很多朋友的问题,我以前也有这样的感觉,编程编到一定的时候,发现能力到了瓶颈,既不深,也不扎实,半吊子.比如:你长期地使用Java和.NET ,这些有虚拟机的语言对于开发便利是便 ...

  5. golang 字符串替换截取

    package main import "fmt" func main() { str := "XBodyContentX" content := str[1 ...

  6. Dijkstra TYVJ 1031热浪 Dijkstra测试数据

    测试用邻接表写得Dijkstra 代码写得很烂. 描述 德克萨斯纯朴的民眾们这个夏天正在遭受巨大的热浪!!!他们的德克萨斯长角牛吃起来不错,可是他们并不是很擅长生產富含奶油的乳製品.Farmer Jo ...

  7. xhtml1-transitional.dtd

    <!-- Extensible HTML version 1.0 Transitional DTD This is the same as HTML 4 Transitional except ...

  8. android平台 cocos2d-x 读取相册数据

    现已解决 方案如下: 1.使用 jni 调用 java 方法 启动相册选择框2.使用java将获取的图片保存到本地3.使用Cocos2d-x中 CCImage 读取 JAVA代码如下: //启动图片选 ...

  9. VHDL之concurrent之block

    1 Simple BLOCK The simple block represents only a way of partitioning the code. It allows concurrent ...

  10. VTK:VTK嵌入MFC成功

    VTK作为医学显示库,得到较多使用.作为较为上层的设计,对OpenGL进行了封装,并且有Windows.Linux.安卓等开发版本,可移植性较强. 不过VES暂时没有编译成功. 以下是嵌入MFC-ID ...