E - Asteroids
二分图 最大匹配;
每次匹配都是都会把一些点连接起来。每个点都只能被匹配一次。
vis 每次都会清空。
match存储的是连接的父辈节点的坐标 。如果没有父辈坐标就连接。若果有了,看看父辈节点是否能够岔开。
#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
int n,m ;
int match[1003][1003];
bool vis[10003];
int pre[1003];
bool dfs(int x)
{
for(int i = 1 ; i <= n; i++)
{
if( match[x][i] == 1&& !vis[i])
{
vis[i]=true;
int tmp=pre[i];
if(tmp==-1||dfs(tmp))
{
pre[i]=x;
return true;
}
}
}
return false;
}
int solve()
{
int res=0;
for(int i=1;i<=n;i++)
pre[i]=-1;
for(int i=1;i<=n;i++)
{
memset(vis,0,sizeof(vis));
if(dfs(i))
res++;
}
return res;
}
int main()
{
while(~scanf("%d%d",&n,&m))
{
int a , b;
for(int i = 0 ;i < m; i++)
{
scanf("%d %d",&a,&b);
match[a][b]=1;
}
printf("%d\n",solve());
}
}