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 ... 
随机推荐
- bitmap自己项目中处理遇到的问题
			String path = "图片路径";Bitmap bitmap = BitmapFactory.decodeFile(path);安卓处理图片都是Bitmap,然后取到图片的 ... 
- python对象的复制问题,按值传递?引用传递?
			这部分这篇博文说的很明白,转了过来 作者:winterTTr (转载请注明)http://blog.csdn.net/winterttr/article/details/2590741#0-tsina ... 
- 批处理备份mysql数据
			客户服务器,需要每天定时备份数据库,没办法,bat走起! 代码如下: @echo off C: cd C:\***\***\mysql\bin set Ymd=%date:~,4%%date:~5,2 ... 
- Debugging that latch timeout
			https://troubleshootingsql.com/tag/stack-dump/ Book on Azure and SQL Server 
- Mac outlook设置自动回复
			outlook是公司必不可少的软件, 在mac下开发,当然用的是mac版的outlook,今天介绍一下如何设置mac下outlook的自动回复. 有两种方式的帐号,一种是Exchange accoun ... 
- C# 格式化 中文星期 显示
			最近有些小忙,直接贴代码吧, /// <summary> /// 获取系统的星期 /// </summary> /// <param name="dt" ... 
- 泽熙学到的 z
			叶展,原泽熙投资总经理助理,现任齐鲁证券资产管理公司总裁助理,齐鲁星空.星汉等集合理财投资经理. 导读:三年前,我加入了泽熙投资,正式成为一名职业投资者.做职业投资者一直是我的理想.在股市中用眼光和头 ... 
- const的限定
			const对象一旦创建后,其值就不可以改变,所以const对象必须初始化.与非const的类型比较,主要区别在于const类型对象执行但是不改变其操作内容. 在默认状态下,const只在文件内有效.在 ... 
- VS2010 MFC中 创建文件夹及文件判空的方法
			1. MFC中 创建文件夹的方法如下: CString strFolderPath = "./Output"; //判断路径是否存在 if(!PathIsDirectory(str ... 
- 报错:OpenCV Error: Assertion failed (src.size() == dst.size() && src.type() == dst.ty pe()) in unknown function, file ..……
			在用cvDilate函数的时候,老是导致程序中断,报错如下: OpenCV Error: Assertion failed (src.size() == dst.size() && s ... 
