只是想贴一张图
图是原创的
代码是从《啊哈算法》中抄的 1,
book 数组这个地方一直都很奇怪,
如果说对应dfs中的当前路径中节点,所以每次dfs前都要重置。但是又不能再dfs返回前吧这个值重新值为零,因为下一次搜索到同一个地方,如果知道这个点已经访问过,就证明这个点必然不能形成增光路径,因此就不用再访问。
但是如果说仅仅是已经访问过的节点,每次最外层的for循环又会把它重置,说不过去。
感觉一个alternative是,
如果dfs返回是true,book[i]=0,如果false,就维持book[i]不变,这样就不用在外层循环中置空。
#include<cstdio>
using namespace std;
int e[101][101];
int match[101];
int book[101];
int n , m;
int dfs(int u)
{
int i;
for(i = 1;i <= n;i++)
{
if(book[i] == 0 && e[u][i] == 1)
{
//book 这个地方一直都很奇怪
book[i] = 1;
if(match[i] == 0 || dfs(match[i]))
{
match[i] = u;
match[u] = i;
return 1;
}
}
}
return 0;
}
int main()
{
int i , j , t1 , t2 , sum = 0;
scanf("%d %d",&n,&m);
for(i = 1;i <= m;i++)
{
scanf("%d %d",&t1,&t2);
e[t1][t2] = 1;
e[t2][t1] = 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++;
}
printf("%d",sum);
return 0;
}
视频参考:
https://www.bilibili.com/video/av16362938/?from=search&seid=4181204272014712416