二分图
染色法
例题ACwing 860 - 染色法判断二分图(染色法)-CSDN博客
给定一个n个点m条边的无向图,图中可能存在重边和自环。
请你判断这个图是否是二分图。
输入格式
第一行包含两个整数n和m。
接下来m行,每行包含两个整数u和v,表示点u和点v之间存在一条边。
输出格式
如果给定图是二分图,则输出“Yes”,否则输出“No”。
数据范围
1≤ n,m≤ 105
输入样例:
4 4
1 3
1 4
2 3
2 4
输出样例:
Yes
#include <bits/stdc++.h> using namespace std; const int N=1e5+5; int n, m, u1, v1, flag=1, color[N]; vector<int> a[N]; bool dfs(int u, int c) { color[u]=c; for (int i=0; i<a[u].size(); i++) { int v=a[u][i]; if (!color[v]) { if (!dfs(v, 3-c)) return false; } else if (color[v]==c) return false; } return true; } int main() { scanf("%d%d", &n, &m); while (m--) { scanf("%d%d", &u1, &v1); a[u1].push_back(v1); a[v1].push_back(u1); } for (int i=1; i<=n; i++) if (!color[i]) if (!dfs(i, 1)) { flag=0; break; } if (flag) printf("Yes"); else printf("No"); return 0; }
例题:
二分图最大匹配P3386 【模板】二分图最大匹配 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)
#include <bits/stdc++.h> using namespace std; const int N=505; int n, m, e, u1, v1, ans=0, vis[N], match[N]; vector<int> a[N]; bool find(int x) { for (int i=0; i<a[x].size(); i++) { int v=a[x][i]; if (!vis[v]) { vis[v]=1; if (!match[v] || find(match[v])) { match[v]=x; return true; } } } return false; } int main() { scanf("%d%d%d", &n, &m, &e); for (int i=1; i<=e; i++) { scanf("%d%d", &u1, &v1); a[u1].push_back(v1); } for (int i=1; i<=n; i++) { memset(vis, 0, sizeof vis); if (find(i)) ans++; } printf("%d", ans); return 0; }
标签:二分,输出,图论,const,int,基础,笔记,染色法,例题 From: https://www.cnblogs.com/didiao233/p/18016081