题目:
https://odzkskevi.qnssl.com/5bfdd346f5edad2099bf7f5f79724a3f?v=1535088614
大致题意和解法:
数据在左右之间传输,求你需要安装的最少的 tracer 以便任何一次传输都能被侦察出来。求二分图最大匹配,最多能匹配多少对,就安几个 tracer。
#include <bits/stdc++.h>
using namespace std;
const int maxn = 10000;
int nx,ny,m;
int t[maxn][maxn];
int vis[maxn];
int cy[maxn];
int dfs(int u)
{
for(int v=0; v<ny; v++)
if(t[u][v]&&!vis[v])
{
vis[v]=1;
if(cy[v]==-1||dfs(cy[v]))
{
cy[v]=u;
return 1;
}
}
return 0;
}
int maxmatch()
{
int ans=0;
for(int i=0; i<nx; i++)
{
memset(vis,0,sizeof(vis)) ;
ans += dfs(i);
}
return ans ;
}
int main()
{
while(scanf("%d",&nx)&&nx)
{
memset(cy,-1,sizeof cy);//这个地方一定不能置成0,因为dfs中可能恰好关联第0个点。
memset(t,0,sizeof t);
scanf("%d%d",&ny,&m);
int st,ed;
for(int i=0; i<m; i++)
{
scanf("%d%d",&st,&ed);
t[st][ed] = 1;
}
printf("%d\n",maxmatch());
}
return 0;
}