POJ2594 Treasure Exploration[DAG的最小可相交路径覆盖]
| Time Limit: 6000MS | Memory Limit: 65536K | |
| Total Submissions: 8301 | Accepted: 3402 |
Description
Recently, a company named EUC (Exploring the Unknown Company) plan to explore an unknown place on Mars, which is considered full of treasure. For fast development of technology and bad environment for human beings, EUC sends some robots to explore the treasure.
To make it easy, we use a graph, which is formed by N points (these N points are numbered from 1 to N), to represent the places to be explored. And some points are connected by one-way road, which means that, through the road, a robot can only move from one end to the other end, but cannot move back. For some unknown reasons, there is no circle in this graph. The robots can be sent to any point from Earth by rockets. After landing, the robot can visit some points through the roads, and it can choose some points, which are on its roads, to explore. You should notice that the roads of two different robots may contain some same point.
For financial reason, EUC wants to use minimal number of robots to explore all the points on Mars.
As an ICPCer, who has excellent programming skill, can your help EUC?
Input
Output
Sample Input
1 0
2 1
1 2
2 0
0 0
Sample Output
1
1
2
Source
Problem : Treasure Exploration
Description : 机器人探索宝藏,有N个点,M条边。问你要几个机器人才能遍历所有的点。
Solution : 二分图的最小路径覆盖。这个题看来好像就是裸的最小路径覆盖,但是题中说了一个点可以遍历多次,这和最小路径覆盖中路径之间不能有交点是矛盾的。那么怎么办呢,我们跑一遍floyd算法,来求出它的传递闭包,这样就可以构造一个新的图了。为什么可以这样呢,因为这样可以新增加边,使得原来路径不能共用同一个点的问题解决了,画个图就明白了。
如果不跑Floyd,那么最小路径覆盖数就是3,{[1->2->3],[4],[5]};跑一下传递闭包,就新增了两条边,如图中虚线所示,这时候4和5这两个点就可以直接连接了,因为[1->2->3]变成了[1->3]给[4->5]让开了一条路。因此以后如果不要求一个点只能走一次,那么就要跑floyd算法。
——摘自网络
#include<cstdio>
#include<cstring>
using namespace std;
const int N=;
int n,m,match[N],f[N][N];
bool vis[N];
void init(){
for(int i=;i<=n;i++){
for(int j=;j<=n;j++){
f[i][j]=;
}
}
for(int i=;i<=n;i++) match[i]=;
}
bool hunguary(int x){
for(int i=;i<=n;i++){
if(!vis[i]&&f[x][i]){
vis[i]=;
if(!match[i]||hunguary(match[i])){
match[i]=x;
return ;
}
}
}
return ;
}
void floyed(){
for(int k=;k<=n;k++){
for(int i=;i<=n;i++){
for(int j=;j<=n;j++){
if(f[i][k]&&f[k][j]){
f[i][j]=;
}
}
}
}
}
void solve(){
int ans=;
for(int i=;i<=n;i++){
memset(vis,,sizeof vis);
if(hunguary(i)) ans++;
}
printf("%d\n",n-ans);
}
int main(){
while(scanf("%d%d",&n,&m)==,n+m){
init();
for(int i=,x,y;i<=m;i++) scanf("%d%d",&x,&y),f[x][y]=;
floyed();
solve();
}
return ;
}
POJ2594 Treasure Exploration[DAG的最小可相交路径覆盖]的更多相关文章
- POJ 2594 Treasure Exploration 最小可相交路径覆盖
最小路径覆盖 DAG的最小可相交路径覆盖: 算法:先用floyd求出原图的传递闭包,即如果a到b有路径,那么就加边a->b.然后就转化成了最小不相交路径覆盖问题. 这里解释一下floyd的作用如 ...
- POJ 2594 Treasure Exploration(最小可相交路径覆盖)题解
题意:有n个点,m条单向边,每个机器人能沿着单向边走,能重复经过一个点,问最少几个机器人走遍n个点 思路:原来以前学的都是不能相交的算法....可相交的做法是跑Floyd把能到达的都加上边,然后跑最小 ...
- 【BZOJ3691】游行 最小可相交路径覆盖转化
因为C是不断变化的而且C是和点权相关和边权无关 所以我们可以MCMF但是MCMF的时候不能与C相关 再分析问题 我们可以认为每条路径S->T只覆盖T这个终点 因为题目中说了如果Si != Ti ...
- FJUT3591 侦测到在途的聚变打击(最小不可相交路径覆盖)题解
题意:给你n个点,点间m条路,给出在每条路要走的时间.现在有q个任务,要摧毁q个点,每次提供ci和ti表示在时间ti摧毁点ci(必须正好在时间ti才能摧毁),每个点可能需要多次摧毁(同一时间能在同一个 ...
- POJ2594 Treasure Exploration【DAG有向图可相交的最小路径覆盖】
题目链接:http://poj.org/problem?id=2594 Treasure Exploration Time Limit: 6000MS Memory Limit: 65536K T ...
- POJ2594 Treasure Exploration(最小路径覆盖)
Treasure Exploration Time Limit: 6000MS Memory Limit: 65536K Total Submissions: 8550 Accepted: 3 ...
- POJ2594 Treasure Exploration
Time Limit: 6000MS Memory Limit: 65536K Total Submissions: 8193 Accepted: 3358 Description Have ...
- POJ-2594 Treasure Exploration,floyd+最小路径覆盖!
Treasure Exploration 复见此题,时隔久远,已忘,悲矣! 题意:用最少的机器人沿单向边走完( ...
- POJ-2594 Treasure Exploration floyd传递闭包+最小路径覆盖,nice!
Treasure Exploration Time Limit: 6000MS Memory Limit: 65536K Total Submissions: 8130 Accepted: 3 ...
随机推荐
- AutoResetEvent 和 ManualResetEvent 多线程应用
AutoResetEvent 1.用于在多线程,对线程进行阻塞放行 static AutoResetEvent auth0 = new AutoResetEvent(false); static Au ...
- layui如何使用内部jQuery?
遇到问题情境: 由于Layui部分内置模块依赖jQuery,所以没有单独引入jQuery,但是在使用$常规写法获取dom元素时,提示未定义 出现问题的原因: 由于Layui部分内置模块依赖jQuery ...
- ansible 2.7.1 快速开始
refer to 官方手册 https://docs.ansible.com/ansible/latest/modules/modules_by_category.html refer to 中文手册 ...
- 开启KindEditor代码高亮功能
KindEditor4.0 开始支持插入代码功能!!!如何使用插入代码功能实现前段页面代码高亮显示和后台代码维护显示!!! 1. 需要高亮显示代码的前台页面需要引用相应的css样式和js文件 < ...
- DEDECMS后台模板修改
一.后台登录页 dede/templets/login.htm去掉底部的代码(类名为login-power.dede-iframe这两个div都要去掉)其中“login.php?dopost=show ...
- hdu254 DFS+BFS
这个题目需要注意以下几点: 1)注意界线问题,箱子和人不可以越界. 2)需要判断人是否可以到达人推箱子的指定位置. 3)不可以用箱子作为标记,因为箱子可以走原来走过的地方,我们用箱子和人推箱子的方向来 ...
- GLSL逐顶点光照[转]
转载:http://blog.csdn.net/hgl868/article/details/7872350 引言 在OpenGL中有三种类型的光:方向光(directional).点光(point) ...
- C#中用鼠标移动页面功能的实现(代码控制滚动条)
项目中需要实现以下功能: 打印预览控件中,可以用鼠标拖动页面,以查看超出显示范围之外的部分内容. 该功能本来可以通过拉动水平和垂直滚动条来实现,但实际使用中,用户更趋向于直接用鼠标拖动页面来实现,很多 ...
- 几种Tab的实现方法
转载请注明出处,谢谢! 学了这久Android,今天来总结一下几种Tab的实现方法 实现方法一: ViewPage来实现 首先创建一个top.xml布局和一个bottom.xml布局,然后在主界面中通 ...
- binary-tree-zigzag-level-order-traversal——二叉树分层输出
Given a binary tree, return the zigzag level order traversal of its nodes' values. (ie, from left to ...