染色法判断二分图
染色法判断二分图的原理:二分图中不存在奇数环(节点数为奇数的环),因此图中相邻两点颜色均应该不同。可以用此方法来判断二分图。
模板题目:https://www.acwing.com/problem/content/862/
代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47
| #include<bits/stdc++.h> using namespace std; const int N =1e5+5; vector<vector<int>>gra(N,vector<int>()); vector<int>color(N,0); int m,n,v,u; bool dfs(int u,int c) { color[u] = c; for(int&v:gra[u]) { if(!color[v]) { if(!dfs(v,3-c))return false; } else { if(color[v]!=3-c) { return false; } } } return true; } int main(void) { scanf("%d%d",&n,&m); while(m--) { scanf("%d%d",&u,&v); gra[u].push_back(v); gra[v].push_back(u); } for(int i=1;i<=n;i++) { if(!color[i]) { if(!dfs(i,1)) { printf("No"); return 0; } } } printf("Yes"); }
|
匈牙利算法
匈牙利算法用来求二分图的最大匹配。
二分图的匹配:给定一个二分图 G,在 G 的一个子图 M 中,M 的边集 {E} 中的任意两条边都不依附于同一个顶点,则称 M 是一个匹配。
二分图的最大匹配:所有匹配中包含边数最多的一组匹配被称为二分图的最大匹配,其边数即为最大匹配数。
模板题目:https://www.acwing.com/problem/content/description/863/
代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39
| #include<bits/stdc++.h> using namespace std; const int N =1001; int n1,n2,m,u,v; vector<vector<int>>gra(N,vector<int>()); vector<bool>vis; vector<int>match(N,0); bool find(int x) { for(int&v:gra[x]) { if(!vis[v]) { vis[v]=true; if(match[v]==0 || find(match[v])) { match[v] =x; return true; } } } return false; } int main(void) { scanf("%d%d%d",&n1,&n2,&m); while(m--) { scanf("%d%d",&u,&v); gra[u].push_back(v); } int res=0; for(int i=1;i<=n1;i++) { vis = vector<bool>(n2,false); if(find(i)) ++res; } printf("%d",res); }
|