染色法判定二分图
一个图是二分图当且仅当图中不含有奇数环。我们可以用染色法判断一个图是不是二分图。如果二分图能够被完美染色,那么它就是二分图,否则不是。染色的过程可以用DFS完成。对于某一个点,我们把他染色为A,那么第一个和它相邻的点的颜色就染色为B,下一个是A,以此类推,可知该条通路上的所有点的颜色都确定。
如图为一个二分图,两个组内部之间没有连线,一个点所连的另外两个点与该点不在一个组内,两个点之间颜色不一样。
#include <bits/stdc++.h>
using namespace std;
const int N =1e5+5;
vector<int>g[N];
int n,m;
int color[N];
bool dfs(int x,int c){
color[x]=c;//先染上该颜色
for(const auto &y:g[x]){
if(!color[y]){
if(!dfs(y,3-c))return false;//如果下一个不是另一个颜色
}
else if(c==color[y]){//和相邻元素颜色一样则false
return false;
}
}
return true;
}
int main(){
ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
cin>>n>>m;
for(int i=1;i<=m;i++){
int x,y;cin>>x>>y;
g[x].push_back(y);
g[y].push_back(x);
}
bool flag=true;
for(int i=1;i<=n;i++){
if(!color[i]){
if(!dfs(i,1)){//取i点颜色为1
flag=false;
break;
}
}
}
if(!flag)cout<<"No"<<"\n";
else cout<<"Yes"<<"\n";
return 0;
}
二分图的最大匹配(匈牙利算法)
如图:求最大匹配的对象数量
首先男1选1,男2选2,男3只能选1或者2,那么再看看女1的对象男1,男1可以喜欢2,但是2有人喜欢了,所以不行,再看看男二,他可以喜欢女3,此时没人选,那么3选3,轮到男4选,此时所有的女生都有人了,所以就不能配对成功。最大匹配数为3。
#include <bits/stdc++.h>
using namespace std;
const int N =1e5+5;
int n1,n2,m;
vector<int>g[N];
bool st[N];//表示这个女孩有没有对象(防止重复选)
int match[N];//match[i]=j表示i这个女孩现在男友是j
bool find(int x){
//遍历自己喜欢的女孩
for(const auto &y:g[x]){
if(!st[y]){
st