题意:
有一个城镇,它的所有街道都是单行的,并且每条街道都是和两个路口相连。同时已知街道不会形成回路。
你的任务是编写程序求最小数量的伞兵,这些伞兵可以访问(visit)所有的路口。对于伞兵的起始降落点不做限制。
Sample Input
2 4 3 3 4 1 3 2 3 3 3 1 3 1 2 2 3
Sample Output
2 1
对于第一个实例 由图可以得到安排一名伞兵从1→→3→→4 另一名去2 所以结果是2
关键还是求最大匹配数,然后节点数-最大匹配数就是最小路径覆盖,即为所有
代码注释:
#include<iostream> #include<cstring> using namespace std; #define N 505 int a[N][N],visit[N],link[N]; int k,n,m; int dfs(int i) { for(int j=1; j<=m; j++) { if(a[i][j]&&!visit[j]) //路口没有访问 { visit[j]=1; if(link[j]==-1||dfs(link[j]))//如果该点没有与其他点关联或者 与之关联的点 由递归可以找到其他点与之相连 { link[j]=i; return 1; } } } return 0; } int hungary() { int sum=0; memset(link,-1,sizeof(link)); for(int i=1; i<=m; i++) { memset(visit,0,sizeof(visit)); if(dfs(i)) sum++; } return sum; } int main() { int T; cin>>T; while(T--) { cin>>m; memset(a,0,sizeof(a)); cin>>k; while(k--) { int x,y; cin>>x>>y; a[x][y]=1; } cout<<m-hungary()<<endl; }
关于二分图其他问题可以查看我其他博客