题意:有n个点和m条有向边,现在要在点上放一些伞兵,伞兵可以沿着图走,
直到不能走为止,每条边有且仅有一个伞兵走过,问最少放多少个伞兵
思路:求的最小路径覆盖,用二分图来做
对于这样的一个有向图做最小路径覆盖,首先建图
然后每一条有向边对应左边的点指向右边的点
这样建好图之后求最大匹配数
最小路径覆盖=点数-最大匹配数
[cpp] view
plaincopyprint?
- #include<stdio.h>
- #include<string.h>
- int n,edge[150][150],link[150],used[150];
- int dfs(int pos)
- {
- int i;
- for(i=1;i<=n;i++)
- if(edge[pos][i]&&!used[i]){
- used[i]=1;
- if(link[i]==-1||dfs(link[i])){
- link[i]=pos;
- return 1;
- }
- }
- return 0;
- }
- int main()
- {
- int T,i,m,a,b,s;
- scanf("%d",&T);
- while(T--){
- scanf("%d%d",&n,&m);
- memset(edge,0,sizeof(edge));
- for(i=1;i<=m;i++){
- scanf("%d%d",&a,&b);
- edge[a][b]=1;
- }
- memset(link,-1,sizeof(link));
- s=0;
- for(i=1;i<=n;i++){
- memset(used,0,sizeof(used));
- s+=dfs(i);
- }
- printf("%d\n",n-s);
- }
- return 0;
- }
时间: 2024-10-24 06:22:24