二分图判定及最大匹配

//二分图的判定 
//染色法 
#include
#include
#include
using namespace std;
const int N =  10000;
int h[N],e[N],ne[N],idx;
int color[N];//染色为1或者2 

void add(int x,int y){
	e[++idx] = y,ne[idx] = h[x],h[x] = idx;
}

bool dfs(int u,int c)//需要将u这个点染成c色
{
	color[u] = c;
	for(int i = h[u] ;i ; i = ne[i]){
		int v = e[i];//对面的点
		if(!color[v]){//如果没有染色 
			if(dfs(v,3-c)) return 1;//u=1则v=2,u=2,v=1;有奇数环则一直返回1 
		} 
		else if(color[v] == c) return 1;//表示v与u同一个集合,且有边,则有奇环 
	}
	return 0;
 } 
 int main()
 {
 	cin>>n>>m;
 	for(int i=0;i>a>>b;
 		add(a,b),add(b,a);
	 }
	 bool flag =0;
	 for(int i= 1; i <= n ;i++){
	 	if(!color[i]){
	 		if(dfs(i,1)){
	 			flag = 1;
	 			break;
			 }
		 }
	 }
	 if(flag) puts("No");
	 else put("Yes");
	 return 0;
  } 

判定:关押罪犯:https://www.acwing.com/problem/content/259/

#include
#include
#include
#include
using namespace std;
const int N = 200010.;
int h[N],e[N],ne[N],v[N],idx;
void add(int x,int y,int z){
	e[++idx] = y,ne[idx] = h[x], v[idx] = z, h[x] = idx;
}
int n,m;
int color[N];
int dfs(int u,int c,int limit){
	color[u] = c;
	for(int i = h[u]; i; i = ne[i]){
		if(v[i] <= limit) continue;
		int j  = e[i];
		if(!color[j])
		{
			if(dfs(j,3-c,limit)) return 1;
		}
		else if(color[j] == c) return 1;
		
	}
	return 0;
}
int check(int limit){
	memset(color,0,sizeof color);
	
	for(int i = 1; i <= n ; i++){
		if(color[i] == 0){
			if(dfs(i,1,limit)) return false;
		}
	}
	return true;
}
int main()
{
		scanf("%d%d",&n,&m);
		for(int i = 1; i <= m; i++){
			int x,y,z; 
			scanf("%d%d%d",&x,&y,&z);
			add(x,y,z);add(y,x,z);
		}
		int l = 0, r = 1e9;
		while(l < r){
			int mid = (r+l) >> 1;
			if(check(mid)) r = mid;
			else l = mid + 1;
		}
		printf("%d\n",l);
	return 0;
}

最大匹配:

P3386 【模板】二分图最大匹配 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)

#include
#include
#include
using namespace std;

const int N = 1e5+10;
int n,m,s;
bool st[N];
int match[N];
int h[N],e[N],ne[N],idx;
void add(int x,int y)
{
	e[++idx]=y,ne[idx]=h[x],h[x]=idx;
}
bool dfs(int u)
{
	for(int i=h[u];i;i=ne[i]){
		int v=e[i];
		if(!st[v]){
			st[v]=true;
			if(!match[v]||dfs(match[v])){
				match[v]=u;
				return true;
			}
		}
	}
	return false;
}
int main()
{
	scanf("%d%d%d",&n,&m,&s);
	for(int i=1;i<=s;i++){
		int x,y;
		scanf("%d%d",&x,&y);
		add(x,y);
	}	
	int ans=0;
	for(int i=1;i<=n;i++){
		memset(st,false,sizeof st);
		if(dfs(i)) ans++;
	}
	printf("%d",ans);
	return 0;
 } 

你可能感兴趣的:(算法,算法,c++)