Description
Input
Output
Sample Input
2 4 3 3 4 1 3 2 3 3 3 1 3 1 2 2 3
Sample Output
2 1
模板题, 求最小路径覆盖
利用公式:最小路径覆盖需要的路径数 = 顶点数 - 最大匹配数
最大匹配数用匈牙利DFS算法实现
#include <iostream> #include <cstdio> #include <cstring> #include <algorithm> #include <cmath> using namespace std; const int MAXN=1000; int uN,vN; //u,v数目 int g[MAXN][MAXN];//编号是0~n-1的 int linker[MAXN]; bool used[MAXN]; bool dfs(int u){ int v; for(v=0;v<=vN;v++) if(g[u][v]&&!used[v]){ used[v]=true; if(linker[v]==-1||dfs(linker[v])){ linker[v]=u; return true; } } return false; } int hungary(){ int res=0; int u; memset(linker,-1,sizeof(linker)); for(u=0;u<=uN;u++){ memset(used,0,sizeof(used)); if(dfs(u)) res++; } return res; } int main(){ int n; int inum, snum; int i; scanf("%d", &n); while(n --){ memset(g, 0, sizeof(g)); scanf("%d %d", &inum, &snum); uN = 0; vN = 0; for(i = 0; i < snum; i ++){ int a; int b; scanf("%d %d", &a, &b); a --; //注意序号 b --; if(a > uN) uN = a; if(b > vN) vN = b; g[a][b] = 1; } int ans = inum - hungary(); printf("%d\n", ans); } return 0; }