二分图染色法查找增广轨

 1 #include<stdio.h>
 2 #include<iostream>
 3 #include<algorithm>
 4 #include<string.h>
 5 using namespace std;
 6 int  mp[1004][1004];
 7 int n,m;
 8 int col[1004];
 9 bool isbg;
10 void dfscol(int i,int c){///i代表结点,c代表颜色
11 if(!isbg)return ;
12 col[i]=c;///染色
13 for(int j=1;j<=n;j++){
14     if(mp[i][j]){///查找相邻的边
15         if(col[j]==-1)///相邻的边没有被染过色
16         dfscol(j,c^1);///染上不同的颜色来区分,1^1=0,0^1=1
17         else if(col[j]==c){///如果出现相邻点颜色相同
18             isbg=false;
19             return ;
20         }
21     }
22 }
23 return ;
24 }
25 bool judge(){
26 isbg=true;
27 for(int i=1;i<=n;i++){
28 if(col[i]!=-1)continue;///如果该点已经被染过色,那么继续查找 下一个结点
29 dfscol(i,1);///用1和0来表示染色,先用1开始染色
30 if(isbg==false)break;
31 }
32 return isbg;
33 }
34 int main()
35 {
36     int m,n;
37     int x,y;
38     while(cin>>n>>m){///n个点,m组边
39             memset(mp,0,sizeof(mp));
40         for(int i=1;i<=m;i++){
41             cin>>x>>y;
42             mp[x][y]=1;
43             mp[y][x]=1;
44         }
45     isbg=true;
46     memset(col,-1,sizeof(col));///用来标记点是否被访问过
47     if(!judge()){
48         cout<<"No\n";
49         continue;
50     }
51     else cout<<"Yes\n";
52     }
53     return 0;
54 }
时间: 2024-07-29 07:02:04

二分图染色法查找增广轨的相关文章

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

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

poj2942圆桌骑士(点双连通分量+二分图染色法判奇圈)

之前一直不明白点双连通分量能用来干嘛,比如边双连通分量可以问加几条边能变成边双连通,这个题目是这样的,每个圆桌会议至少三个骑士参加,因为需要表决意见,所以骑士数目必须是奇数个,直到那些骑士互相憎恨,也就是不能坐在一起的,把能坐在一起的建边,求无法参加任何会议的骑士的个数,重点是任何会议,这点非常关键,这道题之前一直卡在这里,还有就是有的人属于好几种双连通分量,所以全部标记之后再减掉比较好,至于奇数个怎么处理呢,今天才知道原来二分图的判断可以解决奇圈的问题,因为如果是二分图的话,我们染色,相邻的涂

二分图的判定(染色法)和二分图最大匹配(匈牙利)算法及模板

定义 二分图也称二部图,是图论里的一种特殊模型,也是一种特殊的网络流.其最大的特点在于,可以将图里的顶点分为两个集合,且集合内的点没有直接关联,如下图所示. 如果某个图为二分图,那么它至少有两个顶点,且其所有回路的长度均为偶数,任何无回路的的图均是二分图. 1.染色法判断二分图 染色法是对每一个点深搜,与这个点连接的点颜色与此点相反,如果存在环且是偶数环或则不存在环,则满足该条件,如果存在奇数环则不满足(推出矛盾) #include<iostream> #include<cstring&

Codeforces 1093D. Beautiful Graph【二分图染色】+【组合数】

<题目链接> 题目大意: 给你一个无向图(该无向图无自环,且无重边),现在要你给这个无向图的点加权,所加权值可以是1,2,3.给这些点加权之后,要使得任意边的两个端点权值之和为奇数,问总共有多少种可能?结果mod 998244353. 解题分析: 整张图的所有顶点赋权之后,一定分为奇.偶两部分点集,并且,要想使的该图满足条件,任意边的两个端点的奇偶性应该是不同的,所以我们可以用DFS对图进行二分图染色,将图分为两个部分,需要注意的是,该图未必连通.然后就是DFS的过程中,如果下一个点已经染过色

交叉染色法判断二分图

题目链接:传送门 题目大意:给你一副无向联通图,判断是不是二分图 题目思路:交叉染色法 下面着重介绍下交叉染色法的定义与原理 首先任意取出一个顶点进行染色,和该节点相邻的点有三种情况: 1.未染色    那么继续染色此节点(染色为另一种颜色) 2.已染色但和当前节点颜色不同      跳过该点 3.已染色并且和当前节点颜色相同       返回失败(该图不是二分图) 下面在拓展两个概念: (1) 如果一个双连通分量内的某些顶点在一个奇圈中(即双连通分量含有奇圈),那么这个双连通分量的其他顶点也在

染色法判断二分图

染色法判断二分图 给一个无向图,判断是否是二分图. 这很简单: 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

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

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

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

hdu5285-wyh2000 and pupil-(染色法二分图判定)

http://acm.hdu.edu.cn/showproblem.php?pid=5285 题意:把互不认识的人分到两个组,第一组人数尽可能多. 题解:把互不认识的人连起来,当作二分图,二分图可能有多个,对于没有连线的点,扔到第一个图里.二色法对每个二分图染色,记录每个图比较多的颜色的数量累计到答案里. 特判坑:n<=1 或者 m==0 #include<stdio.h> #include<iostream> #include<algorithm> #inclu