【模板】判断二分图

给你一个无向图, 让你判断这是不是一个二分图。

二分图的标准:可以把这个图的点分成两堆,试每条边都连接这两个堆里的点,而一个堆里的点不能相连。

无向图G为二分图的充分必要条件是,G至少有两个顶点, 且其所有回路的长度均为偶数。(???什么意思???)

语文不好,看图吧。

就这个意思。

而现在然你自己判断该怎么判断。

——看代码就能看懂

 1 #include <cstdio>
 2 #include <cstring>
 3
 4 int n, e, cnt;
 5 int head[1001], next[1001], to[1001], color[1001];
 6
 7 void add(int x, int y)
 8 {
 9     to[cnt] = y;
10     next[cnt] = head[x];
11     head[x] = cnt++;
12 }
13
14 bool dfs(int u, int c)
15 {
16     int i, v;
17     color[u] = c;
18     for(i = head[u]; i != -1; i = next[i])
19     {
20         v = to[i];
21         if(color[v] == c) return 0;
22         if(color[v] == 0 && !dfs(v, -c)) return 0;
23     }
24     return 1;
25 }
26
27 bool solve()
28 {
29     int i;
30     for(i = 1; i <= n; i++)
31      if(color[i] == 0 && !dfs(i, 1))
32       return 0;
33     return 1;
34 }
35
36 int main()
37 {
38     int i, x, y;
39     scanf("%d %d", &n, &e);
40     memset(head, -1, sizeof(head));
41     for(i = 1; i <= e; i++)
42     {
43         scanf("%d %d", &x, &y);
44         add(x, y);
45         add(y, x);
46     }
47     if(solve()) printf("YES");
48     else printf("NO");
49     return 0;
50 }

时间: 2024-10-22 18:50:31

【模板】判断二分图的相关文章

P3386 【模板】二分图匹配

洛谷—— P3386 [模板]二分图匹配 题目背景 二分图 题目描述 给定一个二分图,结点个数分别为n,m,边数为e,求二分图最大匹配数 输入输出格式 输入格式: 第一行,n,m,e 第二至e+1行,每行两个正整数u,v,表示u,v有一条连边 输出格式: 共一行,二分图最大匹配 输入输出样例 输入样例#1: 1 1 1 1 1 输出样例#1: 1 说明 n,m<=1000,1<=u<=n,1<=v<=m 因为数据有坑,可能会遇到v>m的情况.请把v>m的数据自觉过

hdu2444The Accomodation of Students【判断二分图+最大匹配】

我觉得有必要粘一下英文: The Accomodation of Students Time Limit: 5000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 2502    Accepted Submission(s): 1190 Problem Description There are a group of students. Some of them may

hdu 1829 A Bug&#39;s Life(判断二分图)

A Bug's Life Time Limit: 15000/5000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 8528    Accepted Submission(s): 2745 Problem Description Background  Professor Hopper is researching the sexual behavior of a rare

染色法判断二分图

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

HDU4751Divide Groups【判断二分图】

Divide Groups Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 1141    Accepted Submission(s): 414 Problem Description   This year is the 60th anniversary of NJUST, and to make the celebration mo

luoguP3386 【模板】二分图匹配

P3386 [模板]二分图匹配 题目背景 二分图 感谢@一扶苏一 提供的hack数据 题目描述 给定一个二分图,结点个数分别为n,m,边数为e,求二分图最大匹配数 输入输出格式 输入格式: 第一行,n,m,e 第二至e+1行,每行两个正整数u,v,表示u,v有一条连边 输出格式: 共一行,二分图最大匹配 输入输出样例 输入样例#1: 复制 1 1 1 1 1 输出样例#1: 复制 1 说明 因为数据有坑,可能会遇到 v>mv>m 的情况.请把 v>mv>m 的数据自觉过滤掉. 算法

判断二分图

判断二分图方法:用染色法,把图中的点染成黑色和白色.首先取一个点染成白色,然后将其相邻的点染成黑色,如果发现有相邻且同色的点,那么就退出,可知这个图并非二分图. int istwo(int u) { queue<int> E; mem(vis, -1); E.push(u); vis[u] = 1; while(!E.empty()) { u = E.front(); E.pop(); for(int i=0; i<G[u].size(); i++) { int v = G[u][i];

[leetcode]785. Is Graph Bipartite? [bai&#39;pɑrtait] 判断二分图

Given an undirected graph, return true if and only if it is bipartite. Example 1: Input: [[1,3], [0,2], [1,3], [0,2]] Output: true Explanation: The graph looks like this: 0----1 | | | | 3----2 We can divide the vertices into two groups: {0, 2} and {1

785. 判断二分图——本质上就是图的遍历 dfs或者bfs

785. 判断二分图 给定一个无向图graph,当这个图为二分图时返回true. 如果我们能将一个图的节点集合分割成两个独立的子集A和B,并使图中的每一条边的两个节点一个来自A集合,一个来自B集合,我们就将这个图称为二分图. graph将会以邻接表方式给出,graph[i]表示图中与节点i相连的所有节点.每个节点都是一个在0到graph.length-1之间的整数.这图中没有自环和平行边: graph[i] 中不存在i,并且graph[i]中没有重复的值. 示例 1: 输入: [[1,3], [