HDU 1151 Air Raid
DAG的最小路径覆盖
#include<stdio.h> #include<iostream> #include<algorithm> #include<string.h> #include<vector> using namespace std; const int MAXN=550; int linker[MAXN]; bool used[MAXN]; vector<int>Map[MAXN]; int uN; int jz[MAXN][MAXN]; int n,m; bool dfs(int u) { for(int i=0; i<Map[u].size(); i++) { if(!used[Map[u][i]]) { used[Map[u][i]]=true; if(linker[Map[u][i]]==-1||dfs(linker[Map[u][i]])) { linker[Map[u][i]]=u; return true; } } } return false; } int hungary() { int u; int res=0; memset(linker,-1,sizeof(linker)); for(u=1; u<=uN; u++) { memset(used,false,sizeof(used)); if(dfs(u)) res++; } return res; } int main() { int u,k,v; int TT; scanf("%d",&TT); while(TT--) { scanf("%d%d",&n,&m); for(int i=0; i<=n; i++) Map[i].clear(); for(int i=0; i<m; i++) { scanf("%d%d",&u,&v); Map[u].push_back(v); } uN=n; printf("%d\n",n-hungary()); } return 0; }