poj 2594 Treasure Exploration(最小路径覆盖,可重点)
题意:选出最小路径覆盖图中所有点,路径可以交叉,也就是允许路径有重复的点。
分析:这个题的难点在于如何解决有重复点的问题~方法就是使用Floyd求闭包,就是把间接相连的点直接连上边,然后就是求最小路径覆盖了。我来大概解释一下为什么是对的,首先我们要明确,当我们重复利用一个点的时候,一定是有两个比较良好的路径相交了,而二分图是不允许这样的情况存在的,因为那必然存在了一个点有一个以上的出度或者入度了,而怎么避免这个问题呢,看下面的图:
这就是针对这个问题的一个典型的模型,如果使用正常二分图,求得的匹配值为2,路径数为3(例如:2-3-5,1,4),但是如果我们把3用两次,那么求得的答案就是2了(例如:2-3-5,1-3-4).
so,我们的解决办法就出来了,当(2-3-5)这个路径被选择的时候,我们在(1-3-4)这个路径时只要把3无视掉,直接在1-4之间建一条边就可以了,那样1-4就匹配成功了。这样所有含有交叉点的路径,都可以先选择一个路径,然后直接跨过交叉点连接一个,它所代表的仍然是经过交叉点的路径。
有人也许会问,Floyd会压缩所有的边,会不会导致错误呢? 不会,比如这个图(1-4)和(1-5)都有边,在匹配中二分图是最大匹配,他会优先获得较多的匹配,最后无法找到增广路,才会考虑我们连接的边,不要因为边都被压缩了有一种答案会变小的错误。代码如下:

#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
#define maxn 510
int maps[maxn][maxn],vis[maxn],link[maxn];
int n,m;
void floyd()
{
for(int i = ; i <= n; i++)
{
for(int j = ; j <= n; j++)
{
if(!maps[i][j])
{
for(int k = ; k <= n; k++)
{
if(maps[i][k] && maps[k][j])
{
maps[i][j] = ;
break;
}
}
}
}
}
}
bool dfs(int u)
{
for(int i = ; i <= n; i++)
{
if(maps[u][i] && !vis[i])
{
vis[i] = ;
if(link[i] == - || dfs(link[i]))
{
link[i] = u;
return true;
}
}
}
return false;
}
int slove()
{
int ans = ;
memset(link,-,sizeof(link));
for(int i = ; i <= n; i++)
{
memset(vis,,sizeof(vis));
if(dfs(i)) ans++;
}
return ans;
}
int main()
{
int x,y;
while(~scanf("%d%d",&n,&m))
{
if(!n && !m) break;
memset(maps,,sizeof(maps));
while(m--)
{
scanf("%d%d",&x,&y);
maps[x][y] = ;
}
floyd();
printf("%d\n",n-slove());
}
return ;
}
poj 2594 Treasure Exploration(最小路径覆盖,可重点)的更多相关文章
- poj 2594 Treasure Exploration(最小路径覆盖+闭包传递)
http://poj.org/problem?id=2594 Treasure Exploration Time Limit: 6000MS Memory Limit: 65536K Total ...
- Poj 2594 Treasure Exploration (最小边覆盖+传递闭包)
题目链接: Poj 2594 Treasure Exploration 题目描述: 在外星上有n个点需要机器人去探险,有m条单向路径.问至少需要几个机器人才能遍历完所有的点,一个点可以被多个机器人经过 ...
- POJ 2594 传递闭包的最小路径覆盖
Treasure Exploration Time Limit: 6000MS Memory Limit: 65536K Total Submissions: 7171 Accepted: 2 ...
- POJ 2594 (传递闭包 + 最小路径覆盖)
题目链接: POJ 2594 题目大意:给你 1~N 个点, M 条有向边.问你最少需要多少个机器人,让它们走完所有节点,不同的机器人可以走过同样的一条路,图保证为 DAG. 很明显是 最小可相交路径 ...
- POJ 2594 Treasure Exploration(最小路径覆盖变形)
POJ 2594 Treasure Exploration 题目链接 题意:有向无环图,求最少多少条路径能够覆盖整个图,点能够反复走 思路:和普通的最小路径覆盖不同的是,点能够反复走,那么事实上仅仅要 ...
- POJ 2594 —— Treasure Exploration——————【最小路径覆盖、可重点、floyd传递闭包】
Treasure Exploration Time Limit:6000MS Memory Limit:65536KB 64bit IO Format:%I64d & %I64 ...
- POJ 2594 Treasure Exploration (可相交最小路径覆盖)
题意 给你张无环有向图,问至少多少条路径能够覆盖该图的所有顶点--并且,这些路径可以有交叉. 思路 不是裸的最小路径覆盖,正常的最小路径覆盖中两个人走的路径不能有重复的点,而本题可以重复. 当然我们仍 ...
- POJ 2594 Treasure Exploration(带交叉路的最小路径覆盖)
题意: 派机器人去火星寻宝,给出一个无环的有向图,机器人可以降落在任何一个点上,再沿着路去其他点探索,我们的任务是计算至少派多少机器人就可以访问到所有的点.有的点可以重复去. 输入数据: 首先是n和 ...
- POJ 2594 Treasure Exploration (Floyd+最小路径覆盖)
<题目链接> 题目大意: 机器人探索宝藏,有N个点,M条边.问你要几个机器人才能遍历所有的点. 解题分析: 刚开始还以为是最小路径覆盖的模板题,但是后面才知道,本题允许一个点经过多次,这与 ...
随机推荐
- RHCE备考倒计时
2014年7月31日 周四 上海考试 认证RHCE6
- gcc及其选项详解 【转载】
1.简介: gcc是gnu旗舰产品,目前基本上就是和unix捆绑在一起分发的.这个东西功能强大,但是有多达上千个选项,其用户手册也有将近一万行.虽然其中的多数选项平时很少用到.但是不管装软件还是写程序 ...
- 调用Lua出错
错误提示:Could not load file or assembly 'lua51' or one of its dependencies. An attempt was made to load ...
- UVALive 7070 The E-pang Palace(暴力)
实话说这个题就是个暴力,但是有坑,第一次我以为相含是不行的,结果WA,我加上相含以后还WA,我居然把这两个矩形的面积加在一块了吗,应该取大的那一个啊-- 方法就是枚举对角线,为了让自己不蒙圈,我写了一 ...
- bat自动创建文件夹(以当前时间命名)
先cmd中查看当前的日期和时间: @echo off color 0a set dt=%date%%time% echo %dt%pause 1.使用截取进行命名(时间为12小时制时命名会出现空格,不 ...
- wmic应用实例
实例应用 1.磁盘管理 查看磁盘的属性 wmic logicaldisk list brief ::caption=标题.driveID=驱动器ID号.model=产品型号.Partitions=分区 ...
- DOM操作-遍历一个元素的所有属性
代码: <!DOCTYPE html> <html> <head> <title>遍历打印一个元素的所有属性</title> <met ...
- Django:之安全、国际化和session
Django 安全 以下是关于Django安全的一些特征,它包括如何使基于Django的网站的一些建议. 关于安全的官方文档:https://docs.djangoproject.com/en/dev ...
- Tomcat 7优化
1.在bin/catalina.bat文件中加入下面参数,对JVM进行优化,至于这一大驼参数的作用及说明,大家到网上找找,应该有很多的,如:http://www.mzone.cc/article/32 ...
- Inno Setup入门(四)——为程序创建桌面快捷方式
Icons这一可选段定义所有创建在开始菜单和\或其它位置 (比如桌面) 的快捷方式.一个例子如下: [setup] ;全局设置,本段必须 AppName=Test AppVerName=TEST De ...