ACM入门之二分图
Posted 辉小歌
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了ACM入门之二分图相关的知识,希望对你有一定的参考价值。
性质 :
- 如果两个集合中的点分别染成黑色和白色,可以发现二分图中的每一条边都一定是连接一个黑色点和一个白色点。
- 二分图不存在长度为奇数的环(因为每一条边都是从一个集合走到另一个集合,只有走偶数次才可能回到同一个集合。)
染色法判定二分图模板
#include<bits/stdc++.h>
using namespace std;
const int N=1e5*3+10;
int h[N],e[N],ne[N],idx;
int st[N],n,m;
void add(int a,int b)
e[idx]=b,ne[idx]=h[a],h[a]=idx++;
bool dfs(int u,int c)
st[u]=c;
for(int i=h[u];i!=-1;i=ne[i])
int j=e[i];
if(!st[j]&&!dfs(j,3-c)) return false;
else if(st[j]&&st[u]==st[j]) return false;
return true;
int main(void)
memset(h,-1,sizeof h);
cin>>n>>m;
while(m--)
int a,b; cin>>a>>b;
add(a,b),add(b,a);
bool flag=1;
for(int i=1;i<=n;i++)
if(!st[i]&&!dfs(i,1)) flag=0;
if(!flag) break;
if(flag) puts("Yes");
else puts("No");
return 0;
匈牙利算法解决二分图的最大匹配模板
const int N=510;
const int M=1e5+10;
int h[N],e[M],ne[M],idx;
int st[N],match[N];
int n1,n2,m;
void add(int a,int b)
e[idx]=b,ne[idx]=h[a],h[a]=idx++;
bool find(int u)
for(int i=h[u];i!=-1;i=ne[i])
int j=e[i];
if(!st[j])
st[j]=1;
if(match[j]==0|| find(match[j]))
match[j]=u;
return true;
return false;
void init()
int res=0;
for(int i=1;i<=n1;i++)
memset(st,0,sizeof st);
if(find(i)) res++;
cout<<res;
以上是关于ACM入门之二分图的主要内容,如果未能解决你的问题,请参考以下文章