Problem : Air Raid
Description : 有一些城镇,现在这些城镇之间有一些街道可以连接两个城镇,现在有一些伞兵要游览城镇,且不能有两个伞兵游览同一个城镇。现在问你至少需要多少个伞兵才能游览所有的城镇。
Solution : 看题意就能知道是二分图的最小路径覆盖。很裸。
Code(C++) :
#include <stdio.h>
#include <string.h>
#include <iostream>
#include <string>
#include <vector>
#define ABS(a) ((a)>0? (a):(-(a)))
using namespace std;
const int F=500+25;
typedef struct tagNode{
int h,s;
int a,b,c,d;
tagNode(){}
tagNode(int H,int S,int A,int B,int C,int D):
h(H),s(S),a(A),b(B),c(C),d(D){}
}Node;
int n,m;
vector<int> edge[F];
bool used[F];
int belong[F];
Node line[F];
bool dfs(int s)
{
for(int i=0;i<edge[s].size();i++){
int end=edge[s].at(i);
if(used[end])
continue;
used[end]=true;
if(belong[end]==-1||dfs(belong[end])){
belong[end]=s;
return true;
}
}
return false;
}
int main()
{
//freopen("in.data","r",stdin);
int N;
cin>>N;
while(N--){
for(int i=0;i<F;i++)
edge[i].clear();
memset(belong,-1,sizeof(belong));
cin>>n>>m;
int x,y;
for(int i=1;i<=m;i++)
cin>>x>>y,
edge[x].push_back(y);
int sum=0;
for(int i=1;i<=n;i++){
memset(used,false,sizeof(used));
if(dfs(i))
++sum;
}
printf("%d\n",n-sum);
}
return 0;
}