使用了匈牙利算法(就是暴力)
具体思路还是友链吧
这是我基佬然而他是一位htlm选手。所以看他的blog会很卡
我就是想解释一下vis数组的意义~~可能有纰漏o( ̄▽ ̄)d ~~
#include<cstdio>
#include<iostream>
#include<cstring>
#include<algorithm>
#include<vector>
using namespace std;
int read()
{
int s=0;
char in=getchar();
while(in<'0'||in>'9')
in=getchar();
while(in>='0'&&in<='9')
{
s=(s<<3)+(s<<1)+in-'0';
in=getchar();
}
return s;
}
//bool map[1010][1010];//用的是邻接表
vector<int>rel[1010];
int pat[1010];
bool vis[1010];
int n,m,e;
bool dfs(int x)
{
for(int i=0;i<rel[x].size();i++)
if(!vis[rel[x][i]])//如果他没有被尝试匹配
{
vis[rel[x][i]]=true;//已尝试匹配,为什么这里一定要被变为true呢?
//如果这个点可以霸占他,一定是要被标记的。如果不能的话。说明这个点已经名花有主了,所以也要被标记
if(!pat[rel[x][i]]||dfs(pat[rel[x][i]]))
{
pat[rel[x][i]]=x;
return true;
}
}
return false;
}
int main()
{
n=read();
m=read();
e=read();
int a,b;
for(int i=1;i<=e;i++)
{
a=read();
b=read();
if(a<=n&&b<=m)
//map[a][b]=true;
rel[a].push_back(b);
}
int ans=0;
for(int i=1;i<=n;i++)
{
memset(vis,false,sizeof(vis));
if(dfs(i))
ans+=1;
}
printf("%d",ans);
}