首页 > 代码库 > poj 1422 Air Raid (最小路径覆盖)
poj 1422 Air Raid (最小路径覆盖)
链接:poj 1422
题意:有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;
- }
poj 1422 Air Raid (最小路径覆盖)
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。