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 ...
随机推荐
- 使用Powerdesigner生成设计的数据表(一张或多张)的测试数据
设计表完成以后,我们需要生成一些测试数据,可以直接更新到数据库中,下面我们就来试试: 第一步:建立需要的Profiles测试文件,[Model]--[Test Data Profiles],如图所示: ...
- HDU 2767.Proving Equivalences-强连通图(有向图)+缩点
Proving Equivalences Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Oth ...
- 从壹开始 [ Ids4实战 ] 之四 ║ 用户数据管理 & 前后端授权联调
前言 哈喽~~~ 大家周一好!夏天到了,大家舒服了没有,熟话说,打败你的不是天真,是天真热!
- Java 8 Lambda表达式的使用
lambda表达式允许你通过表达式来代替功能接口.lambda表达式就和方法一样,它提供了一个正常的参数列表和一个使用这些参数的主体(body,可以是一个表达式或一个代码块). Lambda表达式还增 ...
- Jenkins集成java非maven/ant项目的打包思路
打包的思路如下: 1.使用javac命令对代码进行编译,比如递归编译整个项目的java代码.(注意:需要一一对应引用的jar包) 2.输出并整理war包的文件夹结构目录,参考:http://www.c ...
- JAVAWEB开发之JSP、EL、及会话技术(Cookie和Session)的使用详解
Servlet的缺点 开发人员要十分熟悉JAVA 不利于页面调试和维护(修改,重新编译) 很难利用网页设计工具进行页面设计(HTML内容导入到servlet中,用PrintWriter的对象进行输出) ...
- EasyMvc入门教程-基本控件说明(12)栏目导航
栏目导航一般用来显示当前页面所在的模块层级位置关系,如下图所示: 当然也有前端网站作为小栏目导航,凡是没有绝对,只要不违和就好:),下面上代码: @{ var data = new List<N ...
- ZRender实现粒子网格动画实战
注:本博文代码基于ZRender 3.4.3版本号开发,相应版本号库地址:ZRender 库. 效果 实现分析 通过上面显示的效果图,能够看出,这样的效果就是在Canvas中生成多个可移动的点,然后依 ...
- Codis的了解和操作
1.Codis的基本架构 2.Codis各组件 Codis-server:就是redis服务,可以使用codis修改的reids和原生的redis Codis-proxy:客户端连接的代理服务,客户端 ...
- CocoaAsyncSocket使用笔记
先去github的站点下载最新的包,然后先看看介绍. 写的比較具体了 https://github.com/robbiehanson/CocoaAsyncSocket/wiki/Intro_GCDAs ...