题目链接:http://poj.org/problem?id=3041
Description
Input
Output
Sample Input
3 4 1 1 1 3 2 2 3 2
Sample Output
2
Hint
Source
题意:
一个n * n的矩阵,在矩阵上有 m 个小行星,每一个武器都可以消灭一行或一列的小行星
问最少使用的武器消灭所有的行星?
代码如下:
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<iostream>
using namespace std;
#define MAXN 517
int N;
int g[MAXN][MAXN], linker[MAXN];
bool used[MAXN];
int dfs(int L)//从左边开始找增广路径
{
int R;
for(R = 1 ; R <= N ; R++ )//这个顶点编号从0开始,若要从1开始需要修改
{
if(g[L][R]!=0 && !used[R])
{
//找增广路,反向
used[R]=true;
if(linker[R] == -1 || dfs(linker[R]))
{
linker[R]=L;
return 1;
}
}
}
return 0;//这个不要忘了,经常忘记这句
}
int hungary()
{
int res = 0 ;
int L;
memset(linker,-1,sizeof(linker));
for( L = 1 ; L <= N ; L++ )
{
memset(used,0,sizeof(used));
if(dfs(L) != 0)
res++;
}
return res;
}
int main()
{
int k, res, L, R;
while(~scanf("%d%d",&N,&k))
{
memset(g,0,sizeof(g));
for(int i = 1 ; i <= k ; i++ )
{
scanf("%d%d",&L,&R);
g[L][R] = 1;
}
res = hungary();
printf("%d\n",res);
}
return 0 ;
}
原文地址:http://blog.csdn.net/u012860063/article/details/39177639