交叉染色法判断二分图

题目链接:传送门

题目大意:给你一副无向联通图,判断是不是二分图

题目思路:交叉染色法

    下面着重介绍下交叉染色法的定义与原理

    首先任意取出一个顶点进行染色,和该节点相邻的点有三种情况:

          1.未染色    那么继续染色此节点(染色为另一种颜色)

          2.已染色但和当前节点颜色不同      跳过该点

          3.已染色并且和当前节点颜色相同       返回失败(该图不是二分图)

    下面在拓展两个概念:

     (1) 如果一个双连通分量内的某些顶点在一个奇圈中(即双连通分量含有奇圈),那么这个双连通分量的其他顶点也在某个奇圈中;

     第一个条件的证明:我们假设有一个奇圈,因为是点双,没有割点,必然有紧挨着的圈,假设这个是偶数圈,则,这个偶数圈必然能和原来的奇圈组成新的奇圈(因为:新的圈=(奇数圈-k)+(偶数圈-k)=奇数+偶数-偶数=奇数,k是共同边上的点数

     (2) 如果一个双连通分量含有奇圈,则他必定不是一个二分图。反过来也成立,这是一个充要条件。

 1 #include <iostream>
 2 #include <cstdio>
 3 #include <cstdlib>
 4 #include <cmath>
 5 #include <algorithm>
 6 #include <cstring>
 7 #include <stack>
 8 #include <cctype>
 9 #include <queue>
10 #include <string>
11 #include <vector>
12 #include <set>
13 #include <map>
14 #include <climits>
15 #define lson root<<1,l,mid
16 #define rson root<<1|1,mid+1,r
17 #define fi first
18 #define se second
19 #define ping(x,y) ((x-y)*(x-y))
20 #define mst(x,y) memset(x,y,sizeof(x))
21 #define mcp(x,y) memcpy(x,y,sizeof(y))
22 #define Min(x,y) (x<y?x:y)
23 #define Max(x,y) (x>y?x:y)
24 using namespace std;
25 #define gamma 0.5772156649015328606065120
26 #define MOD 1000000007
27 #define inf 0x3f3f3f3f
28 #define N 5005
29 #define maxn 10005
30 typedef long long LL;
31 typedef pair<int,int> PII;
32
33 int pic[200][200];
34 int vis[200],n,m;
35
36 inline void init(){
37     mst(vis,-1);
38     mst(pic,0);
39 }
40
41 int dfs(int x,int c){
42     if(vis[x]!=-1&&vis[x]==c)return 0;
43     vis[x]=c;
44     for(int i=0;i<n;++i){
45         if(pic[x][i]){
46             if(vis[i]==-1)
47                 dfs(i,c^1);
48             else if(vis[i]==c)return 0;
49         }
50     }
51     return 1;
52 }
53
54 int main(){
55     int i,j,group,Case=0,x,y;
56     while(scanf("%d",&n)!=EOF&&n){
57         scanf("%d",&m);
58         init();
59         if(n==0)break;
60         while(m--){
61             scanf("%d%d",&x,&y);
62             pic[x][y]=pic[y][x]=1;
63         }
64         if(dfs(0,0))printf("BICOLORABLE.\n");
65         else printf("NOT BICOLORABLE.\n");
66     }
67     return 0;
68 }
时间: 2024-10-11 11:53:41

交叉染色法判断二分图的相关文章

poj2942 双联通分量+交叉染色法判断二分图

Knights of the Round Table Time Limit: 7000MS   Memory Limit: 65536K Total Submissions: 11805   Accepted: 3870 Description Being a knight is a very attractive career: searching for the Holy Grail, saving damsels in distress, and drinking with the oth

染色法判断二分图

染色法判断二分图 给一个无向图,判断是否是二分图. 这很简单: 1.把节点1染为1. 2.搜索各点,遍历与此点u相连的点v. 3.如果点v没颜色,把它染为与点u相反的颜色(即-u). 4.如果有颜色,则比较v与u颜色是否相同.若相同,返回0:若不同,则继续. 代码: 1 #include<cstdio> 2 #define N 420000 3 int head[N],next[N],to[N],rs[N],n,m,a,b,y,num; 4 int dfs(int x){ 5 for(int

南阳理工1015 (染色法判断二分图)

题目链接:http://acm.nyist.net/JudgeOnline/problem.php?pid=1015 二部图 时间限制:1000 ms  |  内存限制:65535 KB 难度:1 描述 二部图又叫二分图,我们不是求它的二分图最大匹配,也不是完美匹配,也不是多重匹配,而是证明一个图是不是二部图.证明二部图可以用着色来解决,即我们可以用两种颜色去涂一个图,使的任意相连的两个顶点颜色不相同,切任意两个结点之间最多一条边.为了简化问题,我们每次都从0节点开始涂色 输入 输入: 多组数据

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

用染色法判断二分图是这样进行的,随便选择一个点, 1.把它染成黑色,然后将它相邻的点染成白色,然后入队列 2.出队列,与这个点相邻的点染成相反的颜色 根据二分图的特性,相同集合内的点颜色是相同的,即 但是如果这个图不是二分图,那么就会这样 把与1相邻的点2,3染成白色,然后入队列,然后2出队列,要把与2相邻的点2,3染成黑色,但是都染过了,所以不用染色 但是3的颜色应该与2相反(如果是二分图的话),可是没有相反,所以就不是二分图 1 #include <stdio.h> 2 #include

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

d.给定一个图,判断是不是二分图. s.可以交叉染色,就是二分图:否则,不是. 另外,此题中的图是强连通图,即任意两点可达,从而dfs方法从一个点出发就能遍历整个图了. 如果不能保证从一个点出发可以遍历整个图,那么编程要注意了,应该从每个点出发遍历一次. s2.带权并查集来判断,略复杂.先略过.先上个博客:http://blog.csdn.net/zsc09_leaf/article/details/6727622 c.邻接矩阵,bfs #include<iostream> #include&

UVA 1364 - Knights of the Round Table (找双连通分量 + 二分图染色法判断)

都特么别说话,我先A了这道题! 卧槽啊.....! 题意来自 kuangbin: 亚瑟王要在圆桌上召开骑士会议,为了不引发骑士之间的冲突, 并且能够让会议的议题有令人满意的结果,每次开会前都必须对出席会议的骑士有如下要求: 1.  相互憎恨的两个骑士不能坐在直接相邻的2个位置: 2.  出席会议的骑士数必须是奇数,这是为了让投票表决议题时都能有结果. 注意:1.所给出的憎恨关系一定是双向的,不存在单向憎恨关系. 2.由于是圆桌会议,则每个出席的骑士身边必定刚好有2个骑士. 即每个骑士的座位两边都

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

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3478 题意:有n个路口,m条街,一小偷某一时刻从路口 s 开始逃跑,下一时刻都跑沿着街跑到另一路口,问是否存在某一时刻出,小偷可能出现在任意路口: 如果小偷能走一个环,如果这个环是偶数个节点,那么某个节点只能在偶数时刻或者奇数时刻到达: 但是如果这个环是奇数个节点,他既可以在奇数时刻到达又可以在偶数时刻到达:所以这道题就是求是否存在一个奇环:如果存在输出YES,否则NO: 由于二分图中不能含有奇环,

【01染色法判断二分匹配+匈牙利算法求最大匹配】HDU The Accomodation of Students

http://acm.hdu.edu.cn/showproblem.php?pid=2444 [DFS染色] 1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include<string> 5 #include<cmath> 6 #include<algorithm> 7 8 using namespace std; 9 const int maxn=2e2

HDOJ 题目2444 The Accomodation of Students(染色法判二分图,最大匹配)

The Accomodation of Students Time Limit: 5000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 2943    Accepted Submission(s): 1376 Problem Description There are a group of students. Some of them may know each o