題意:有向圖,傘兵降臨某項點可以遍歷這個點的子樹,求最少的傘兵
解法:最小路徑覆蓋
匈牙利算法 節點數-最大匹配數
- /*************************************************************************
- > File Name: poj1422.cpp
- > Author: cy
- > Mail: [email protected]
- > Created Time: 14/11/9 19:33:21
- ************************************************************************/
- #include<iostream>
- #include<cstring>
- #include <algorithm>
- #include<cstdlib>
- #include<vector>
- #include<cmath>
- #include<stdlib.h>
- #include<iomanip>
- #include<list>
- #include<deque>
- #include<map>
- #include <stdio.h>
- #include <queue>
- const int maxn=1000+5;
- #define inf 0x3f3f3f3f
- #define INF 0x3FFFFFFFFFFFFFFFLL
- #define rep(i,n) for(i=0;i<n;i++)
- #define reP(i,n) for(i=1;i<=n;i++)
- #define ull unsigned long long
- #define ll long long
- #define cle(a) memset(a,0,sizeof(a))
- using namespace std;
- bool bmap[maxn][maxn];
- bool bmask[maxn];
- int n;
- int cx[maxn],cy[maxn];
- int findpath(int u){
- int i,j;
- rep(i,n)if(bmap[u][i]&&!bmask[i]){
- bmask[i]=1;
- if(cy[i]==-1||findpath(cy[i])){
- cy[i]=u;cx[u]=i;return 1;
- }
- }
- return 0;
- }
- int maxmatch(){
- int res=0;
- int i,j;
- rep(i,n)cx[i]=-1,cy[i]=-1;
- rep(i,n)if(cx[i]==-1){
- rep(j,n)bmask[j]=0;
- res+=findpath(i);
- }
- return res;
- }
- int main()
- {
- #ifndef ONLINE_JUDGE
- freopen("in.txt","r",stdin);
- //freopen("out.txt","w",stdout);
- #endif
- int T;
- cin>>T;
- while(T--)
- {
- cin>>n;
- cle(bmap);
- int m;
- scanf("%d",&m);
- while(m--)
- {
- int u,v;
- scanf("%d%d",&u,&v);
- bmap[u-1][v-1]=1;
- }
- printf("%d\\n",n-maxmatch());
- }
- return 0;
- }