二分图
二分图
定义
二分图,又称二部图,英文名叫 Bipartite graph。
二分图是什么节点由两个集合组成,且两个集合内部没有边的图。
换言之,存在一种方案,将节点划分成满足以上性质的两个集合。
二分图的性质:二分图一定不存在长度为奇数的环
染色法判定是否为二分图
思路分析:我们可以对每个点进行DFS并进行染色,如果存在一条边的两点颜色相同则说明不是二分图。
代码示例:
//#pragma注释(链接器,'/stack 336010240000000000,10240000000000 ')
//#pragma GCC优化(2)
#包含位/stdc .h
使用命名空间标准;
#定义For(i,a,b)For(int I=(a);I=(b);(一)
#为(int i=(b)定义Fod(i,b,a);I=(a);我)
#定义复式造表服务处(MultipleListingService)多集
#定义镑下限
#定义泛素蛋白上限
#定义平装书推回
#定义邮政信箱弹出菜单
#定义国际电报电话公司迭代器
#定义endl '\n '
#用_stdio(0)定义IOS IOS :3360 sync _ CIN。平局(0);
#定义低位(x) x (-x)
#定义clr(x) memset(x,0,sizeof(x));
#首先定义船方不负担装货费用
#定义硒秒
数据类型说明矢量罗马数字7
typedef vectorlong长vll
typedef长ll长
数据类型说明无符号长长的长长的
typedef pairint,int pii
typedef pairll,ll pll
const int MAXN=0x7fffffff
const int MOD=1000000007
const ll MOD1=212370440130137957 ll;
常量整数N=1e5 5
int h[N],e[2 * N],ne[2 * N],idx
整数颜色[N];
int n,m;
void add(int a,int b)
{
e[idx]=b,ne[idx]=h[a],h[a]=idx;
}
bool dfs(int u,int c)
{
颜色[u]=c;
for(int I=h[u];我!=-1;i=ne[i]) //对点u的每条出边进行染色
{
int j=e[I];
if(!颜色[j]) //如果还没有染色
{
if(!外勤部(j,3 - c))返回false//如果染色失败
}
else if(color[j]==c)返回false//如果两点颜色相同
}
返回真;
}
int main()
{
//IOS;
CIN;
memset(h,-1,sizeof h);
for(int I=1;I=m;(一)
{
int a,b;
CIN a b;
添加(a,b);
添加(b,a);
}
弯曲件标志=真;
for(int I=1;I=n;(一)
if(!颜色[i])
if(!外勤部(一,1))//外勤部(一、三)表示对我进行深度优先搜索染色后是否成功
{
标志=假
打破;
}
如果(标志)置位('是');
else puts(' No ');
返回0;
}
二分图最大匹配----匈牙利算法
我们先将点归为两个集合,分别记为1和2
由于要找到最大匹配,我们只需对1进行遍历向2匹配即可,不用对2再进行一遍同样操作。对于每一个点,我们先遍历他的所有出边,随后只要找到一个能匹配的就进行匹配,并用数组记录下来,但如果出边的终点已经有匹配了,则就再去寻找出边终点匹配的点(已用数组记录)是否有其他可匹配的点
代码示例:
//#pragma注释(链接器,'/stack 336010240000000000,10240000000000 ')
//#pragma GCC优化(2)
#包含位/stdc .h
使用命名空间标准;
#定义For(i,a,b)For(int I=(a);I=(b);(一)
#为(int i=(b)定义Fod(i,b,a);I=(a);我)
#定义复式造表服务处(MultipleListingService)多集
#定义镑下限
#定义泛素蛋白上限
#定义平装书推回
#定义邮政信箱弹出菜单
#定义国际电报电话公司迭代器
#定义endl '\n '
#用_stdio(0)定义IOS IOS :3360 sync _ CIN。平局(0);
#定义低位(x) x (-x)
#定义clr(x) memset(x,0,sizeof(x));
#首先定义船方不负担装货费用
#定义硒秒
数据类型说明矢量罗马数字7
typedef vectorlong长vll
typedef长ll长
数据类型说明无符号长长的长长的
typedef pairint,int pii
typedef pairll,ll pll
const int MAXN=0x7fffffff
const int MOD=1000000007
const ll MOD1=212370440130137957 ll;
常量整数N=505
const int M=1e5 5
int n1,n2,m;
int h[N],ne[M],e[M],idx
(同Internationalorganizations)国际组织匹配[N];
布尔街;
void add(int a,int b)
{
e[idx]=b,ne[idx]=h[a],h[a]=idx;
}
布尔查找(int x)
{
for(int I=h[x];~我;我不知道
{
int j=e[I];
if(st[j])继续;//j这一轮已经匹配了
st[j]=真;
if(match[j]==0 | | find(match[j])//match[j]存的是当前j的匹配对象
{
match[j]=x;//进行匹配
返回真;
}
}
返回错误的
}
int main()
{
//IOS;
CIN n1 N2 m;
memset(h,-1,sizeof h);
for(int I=1;I=m;(一)
{
int a,b;
CIN a b;
添加(a,b);
}
int RES=0;
for(int I=1;i=n1(一)
{
memset(st,false,st的大小);//每次都要初始化圣,因为每一轮遍历都有可能推翻之前的匹配
if(find(I))RES;
}
cout res endl
返回0;
}
内容来源网络,如有侵权,联系删除,本文地址:https://www.230890.com/zhan/114079.html