二分图的描述性定义:两个点分别在集合A,B中,单个集合中的顶点之间不能相连,即所有边的顶点,分别存在于集合A和集合B中。
算法思想:连锁反应,迭代,深度优先(待补充…)
增广路的概念:寻找到一条增广路,匹配数加1
PS: 二分图在任务调度、工作安排等方面有较多应用…
#include<stdio.h>
int e[101][101]; //存放输入,数组元素为1时表示有无向边相连
int match[101]; //match[u]=v 表示顶点u与v之间有无向边相连,初始值为0表示所有顶点之间无连接关系
int book[101]; //标记:某顶点是否已经被访问过,0表示未访问,1表示访问过
int n,m; //计数:n个顶点,m条边
int dfs(int u)
{
int i;
for(i=1;i<=n;i++)
{
if(book[i]==0&&e[u][i]==1)
{
book[i]=1;
if(match[i]==0 || dfs(match[i]))
{
//更新匹配关系
match[u]=i;
return 1;
}
}
}
return 0;
}
int main()
{
int i,j,t1,t2; //t1,t2:边的两顶点下标
int sum=0; //用于计数:匹配数
scanf("%d %d",&n,&m);
for (i=1;i<=m;i++)
{
scanf("%d%d",&t1,&t2);
e[t1][t2]=1;
}
for(i=1;i<=n;i++) match[i]=0;
for(i=1;i<=n;i++)
{
for(j=1;j<=n;j++) book[j]=0;
if(dfs(i)) sum++;//寻找增广路,若找到,匹配数加1
}
printf("%d",sum);
getchar();getchar();
return 0;
}