蒟蒻的想法是这样的:
一个点寻找匹配时,要为它做出调整的其他点一定已经有匹配过(已经搜过)
已经搜过的点上已经尝试过不能找到新的匹配的边在以后的尝试中也不能找到新的匹配
则在原先的每个左部点上寻找新的匹配时不用遍历之前搜过的边
然后照此思路优化,结果WA #3 #6 #7,求大佬指出错误QwQ
代码如下
#include<iostream>
#include<vector>
using namespace std;
#define MAXN 510
#define MAXM 50010
vector<int>to[MAXN];
int match[MAXN],st[MAXN];
int n1,n2,m,ans=0;
bool dfs(int p)
{
for(int i=st[p];i<to[p].size();i=st[p])
{
st[p]++;
if(!match[to[p][i]]||dfs(match[to[p][i]]))
{
match[to[p][i]]=to[p][i];
return 1;
}
}
return 0;
}
int main()
{
ios::sync_with_stdio(0);
cin.tie(0),cout.tie(0);
cin>>n1>>n2>>m;
for(int i=1,u,v;i<=m;i++)
{
cin>>u>>v;
to[u].push_back(v);
}
for(int i=1;i<=n1;i++)
ans+=dfs(i);
cout<<ans;
return 0;
}