POJ 1422【最小路覆盖数】
2024-09-02 23:15:54
题意:
背景:
小镇有n个路口,空降兵可以在任意路口降落。有m条通往别的路口的单向边,但是不会出现循环。
问最少空降多少个士兵可以走完所有路口。
数据输入:
测试组数 t
每组有:
路口数 n
边数 m
接下来m组,每组a b代表a到b的单向边。
思路:
这是一个朴素的最小路覆盖数问题。
定理:最小路覆盖数=节点数-最大匹配数。
二分匹配的匈牙利算法不重复。
【菜鸟第一次写最大匹配,代码的错误在于当找到来源是本身的时候继续递归了】
/*************************************************************************
> File Name: F.cpp
> Author: ttpond
> Created Time: 2015-8-17 9:55:53
************************************************************************/
#include<stdio.h>
#include<string.h>
#include<algorithm>
#include<iostream>
#include<math.h>
#include<vector>
#include<map>
#include<queue>
#include<stack>
using namespace std;
vector<int>tmp[];
bool vis[];
int from[];
int ans=;
void dfs(int n)
{
vector<int>::iterator it;
for(it=tmp[n].begin();it!=tmp[n].end();it++)
{
if(!vis[*it])
{
from[*it]=n;
vis[*it]=;
ans++;
break;
}
else
{
if(from[*it]!=n)
dfs(from[*it]);
}
}
}
int main()
{
int t,tt,v,e;
scanf("%d",&t);
for(tt=;tt<t;tt++)
{
ans=;
memset(vis,,sizeof(vis));
scanf("%d%d",&v,&e);
for(int i=;i<=v;i++)
tmp[i].clear();
for(int i=;i<e;i++)
{
int a,b;
scanf("%d%d",&a,&b);
tmp[a].push_back(b);
}
for(int i=;i<=v;i++)
dfs(i);
printf("%d\n",v-ans);
}
return ;
}
最新文章
- Ubuntu/linux 有关权限修改的命令
- Uniscribe文字自动换行
- NDK编译生成so文件
- dstat
- URL重写案例
- 模拟等待事件row lock waits
- netbean7.4 保存远程项目的时候老是跳警告框的解决方案
- 字符编码终极笔记:ASCII、Unicode、UTF-8、UTF-16、UCS、BOM、Endian
- opencv ,亮度调整【【OpenCV入门教程之六】 创建Trackbar &; 图像对比度、亮度值调整
- 手写Maven的archetype项目脚手架
- python邮件SMTP的GUI编程
- .Net中stirng转Systen.Type的一种实现思路
- 敏捷方法之极限编程(XP)和 Scrum
- AJAX-DOM事件
- Python上下文管理协议:__enter__和__exit__
- Android - 自定义控件和属性(attr和TypedArray)
- ES6标准入门之正则表达式的拓展
- arduino驱动安装
- 51 nod 1200 石子游戏V2 FWT
- 《剑指offer》— JavaScript(25)复杂链表的复制