题目地址:http://acm.hdu.edu.cn/showproblem.php?pid=1151
思路:对于一个有向无环图,其最小简单路径覆盖就是等于节点数减去二分图的最大匹配数
AC代码:
#include <iostream> #include <cstdio> #include <cstdlib> #include <algorithm> #include <queue> #include <stack> #include <map> #include <cstring> #include <climits> #include <cmath> #include <cctype> const int inf = 0x3f3f3f3f;//1061109567 typedef long long LL; #define lson l,m,rt<<1 #define rson m+1,r,rt<<1|1 using namespace std; int map1[130][130]; int hus[130]; int visit[130]; int n; bool find1(int x) { for(int i=1; i<=n; i++) { if(map1[x][i] && !visit[i]) { visit[i] = 1; if(!hus[i] || find1(hus[i])) { hus[i] = x; return true; } } } return false; } int main() { int t; scanf("%d",&t); while(t--) { int m; scanf("%d%d",&n,&m); memset(map1,0,sizeof(map1)); memset(hus,0,sizeof(hus)); for(int i=1; i<=m ;i++) { int a,b; scanf("%d%d",&a,&b); map1[a][b] = 1; } int sum1 = 0; for(int i=1; i<=n; i++) { memset(visit,0,sizeof(visit)); if(find1(i)) sum1++; } printf("%d\n",n-sum1); } return 0; }