题意:给定有向无环图,每个点代表一个城市,一些城市之间有边,在城市上放伞兵,伞兵可以管理在他这条路径上的所有城市,问最小放多少个伞兵,可以经过每一个城市,
就是二分图的最小路径覆盖
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
#include<iostream> #include<string.h> #include<stdio.h> #include<algorithm> #include<vector> #define maxn 10000 using namespace std; vector<int>node[maxn]; int mm[maxn]; int visit[maxn]; int n,m; void init() { cin>>n>>m; for(int i=0;i<=n;i++) node[i].clear(); for(int i=0;i<m;i++) { int a,b; cin>>a>>b; node[a].push_back(b); } } int dfs(int fa) { for(int i=0;i<node[fa].size();i++) { int v=node[fa][i]; if(!visit[v]) { visit[v]=1; if(mm[v]==-1||dfs(mm[v])) { mm[v]=fa; return 1; } } } return 0; } void solve() { int cnt=0; memset(mm,-1,sizeof(mm)); for(int i=1;i<=n;i++) { memset(visit,0,sizeof(visit)); if(dfs(i))cnt++; } cout<<n-cnt<<endl; } int main() { int test; cin>>test; while(test--) { init(); solve(); } return 0; }