题意:一座城市有一些路口,两个路口用一条道路连接(道路是单向的),现在我们要在一些路口空降伞兵,每个伞兵都可以沿着道路走并占领路口,但不能有两个伞兵占领同一个路口的现象,请问最少需要多少伞兵。
分析:把路口当作点,求出最小覆盖不重合路径数即可。
#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>
#include <algorithm>
#include <queue>
#include <vector>
#include <stack>
#include <string>
#define N 1000
#define ll long long
#define INF 0x7fffffffffffffff
using namespace std;
int snum,inum;
int t;
bool connect[N][N];
int match[N];
bool used[N];
bool found(int x){
for(int i=1;i<=inum;i++){
if(!used[i] && connect[x][i]){
used[i] = 1;
if(!match[i] || found(match[i])){
match[i] = x;
return 1;
}
}
}
return 0;
}
int main(){
int i,k,j;
int x,y;
scanf("%d",&t);
while (t--)
{
scanf("%d%d",&inum,&snum);
memset(connect,0,sizeof(connect));
memset(match,0,sizeof(match));
for(i=1;i<=snum;i++){
scanf("%d%d",&x,&y);
connect[x][y] = 1;
}
int cnt = 0;
for(i=1;i<=inum;i++){
memset(used,0,sizeof(used));
if(found(i)){
cnt++;
}
}
printf("%d\n",inum - cnt);
}
return 0;
}