题意 给定n个路口 加上一些单向路 求遍历完所有路口需要多少人 人是空降的 哪里都可以作为起点
求 最小边覆盖 (用最少的边覆盖所有的点) 也叫最小路径覆盖(更形象)
最小边覆盖==所有点-最大匹配数(匈牙利算法)
理解: 如果没有路 则要n个人 多一条路 则可以减一个人 .
#include<bits/stdc++.h> using namespace std; #define MAXI 505 int mp[MAXI][MAXI]; int used[MAXI]; int vis[MAXI];//记录的是匹配情况 int n,m;//n为左图 m为右图 bool dfs(int x) { for(int j=1;j<=n;j++) { if(mp[x][j]&&!used[j]) { used[j]=1; if(!vis[j]||dfs(vis[j])) { vis[j]=x; return true; } } } return false; } int main() { int cas; scanf("%d",&cas); while(cas--) { memset(mp,0,sizeof(mp)); memset(vis,0,sizeof(vis)); scanf("%d%d",&n,&m); while(m--) { int a,b; scanf("%d%d",&a,&b); mp[a][b]=1; } int ans=0; for(int i=1;i<=n;i++) { memset(used,0,sizeof(used)); if(dfs(i))ans++; } printf("%d\n",n-ans); } }