二分图百度百科:https://baike.baidu.com/item/%E4%BA%8C%E5%88%86%E5%9B%BE/9089095?fr=aladdin
二分图求最大匹配实现起来很容易,解决这类问题需要多层次考虑,先开始的谁都不用考虑,后面开始的需要结合前面已经匹配的结果进行考虑。
看不懂的可以留言,看到了即回复。
注意:
不要把dfs(mathc[i])和match[i]==0 写反了,因为程序match[i]==0是判断这个i是否已经匹配了,dfs(mathc[i])是当前这个i已经匹配了,但是后来者居上,step把i抢走了,所以i要回娘家告诉爸妈把老公休了。
测试程序:
#include<stdio.h>
#include<string.h>
#include<iostream>
using namespace std;
int n,m;
int sum=0;
int map[100][100];
int match[100];
int book[100];
int dfs(int step)
{
for(int i=1; i<=n; i++)
{
if(map[step][i]==1)
{
if(book[i]==0)
{
book[i]=1;
if(match[i]==0 || dfs(match[i]))
{
cout<<"I am:"<<step<<" , my wife:"<<i<<endl;
match[i]=step;
match[step]=i;
return 1;
}
}
}
}
return 0;
}
int main()
{
scanf("%d %d",&n,&m);
for(int i=1; i<=m; i++)
{
int a,b;
scanf("%d %d",&a,&b);
map[a][b]=1;
测试结果:
如果看不懂上面我写的,可以看看下面的:
#include<stdio.h>
#include<string.h>
#include<iostream>
using namespace std;
int n,m;
int sum=0;
int map[100][100];
int match[100];
int book[100];
int dfs(int step)
{
cout<<step<<" wait compare"<<endl;
for(int i=1; i<=n; i++)
{
if(map[step][i]==1)
{
if(book[i]==0)
{
book[i]=1;
if(match[i]==0)
{
cout<<"I am:"<<step<<" , my wife:"<<i<<endl;
match[i]=step;
match[step]=i;
return 1;
}
if(dfs(match[i]))
{
cout<<"I am:"<<step<<" , my wife:"<<i<<endl;
match[i]=step;
match[step]=i;
return 1;
}
else
{
cout<<step<<" have compared"<<endl;
return 0;
}
}
}
}
return 0;
}
int main()
{
scanf("%d %d",&n,&m);
for(int i=1; i<=m; i++)
{
int a,b;
scanf("%d %d",&a,&b);
map[a][b]=1;
map[b][a]=1;
}
for(int i=1; i<=n; i++)
{
cout<<"I am:"<<i<<endl;
memset(book,0,sizeof(book));
if(dfs(i))
sum++;
cout<<endl;
}
cout<<sum<<endl;
}
测试结果:
注意:
不要把dfs(mathc[i])和match[i]==0 写反了,因为程序match[i]==0是判断这个i是否已经匹配了,dfs(mathc[i])是当前这个i已经匹配了,但是后来者居上,step把i抢走了,所以i要回娘家告诉爸妈把老公休了。
写反程序测试:
#include<stdio.h>
#include<string.h>
#include<algorithm>
#include<iostream>
using namespace std;
int n,m;
int map[100][100];
int match[100];
int book[100];
int sum;
int dfs(int step)
{
cout<<step<<endl;
for(int i=1; i<=n; i++)
{
if(map[step][i]==1)
{
if(book[i]==0)
{
book[i]=1;
if(dfs(match[i]||match[i]==0))
{
match[i]=step;
match[step]=i;
return 1;
}
}
}
}
return 0;
}
int main()
{
scanf("%d %d",&n,&m);
for(int i=1; i<=m; i++)
{
int a,b;
scanf("%d %d",&a,&b);
map[a][b]=1;
map[b][a]=1;
}
for(int i=1; i<=n; i++)
{
memset(book,0,sizeof(book));
if(dfs(i))
sum++;
}
cout<<sum<<endl;
}
测试结果: