题目:连接就知道了
行和列分别看成两个集合,子弹看成边就行了,一个典型的模板题。
代码如下:
#include<stdio.h>
#include<string.h>
bool used[505];
int map[505][505];
int match[10005];
int n;
bool find(int i)
{
for(int j=1;j<=n;j++)
{
if(map[i][j]&&!used[j])
{
used[j]=true;
if(match[j]==0||find(match[j]))
{
match[j]=i;
return true;
}
}
}
return false;
}
void hungary(int n)
{
int sum=0;
memset(match,0,sizeof(match));
for(int i=1;i<=n;i++)
{
memset(used,false,sizeof(used));
if(find(i))
sum++;
}
printf("%d\n",sum);
}
int main()
{
int m,x,y;
while(scanf("%d%d",&n,&m)!=EOF)
{
memset(map,0,sizeof(map));
for(int i=1;i<=m;i++)
{
scanf("%d%d",&x,&y);
map[x][y]=1;
}
hungary(n);
}
return 0;
}