poj1734 Sightseeing trip【最小环】
| Time Limit: 1000MS | Memory Limit: 65536K | |||
| Total Submissions:8588 | Accepted:3224 | Special Judge | ||
Description
In the town there are N crossing points numbered from 1 to N and M two-way roads numbered from 1 to M. Two crossing points can be connected by multiple roads, but no road connects a crossing point with itself. Each sightseeing route is a sequence of road numbers y_1, ..., y_k, k>2. The road y_i (1<=i<=k-1) connects crossing points x_i and x_{i+1}, the road y_k connects crossing points x_k and x_1. All the numbers x_1,...,x_k should be different.The length of the sightseeing route is the sum of the lengths of all roads on the sightseeing route, i.e. L(y_1)+L(y_2)+...+L(y_k) where L(y_i) is the length of the road y_i (1<=i<=k). Your program has to find such a sightseeing route, the length of which is minimal, or to specify that it is not possible,because there is no sightseeing route in the town.
Input
Output
Sample Input
5 7
1 4 1
1 3 300
3 1 10
1 2 16
2 3 100
2 5 15
5 3 20
Sample Output
1 3 5 2
Source
题意:
有n个点,m条带权无向边。希望找到一条路径最短的环,环上至少包含三个点,输出长度和路径。
思路:
第一次写这种最小环问题。其实本质就是要枚举节点,再枚举路径上和他直接相邻的两个节点。
在floyd算法的步骤里,外层循环k刚开始时,$d[i,j]$保存的是从$i$经过$1~k-1$中的某个节点到$j$的最短路长度。
那么$d[i,j] + g[j,k] + g[k,i]$就是一个从$i$经过$j$直接到$k$再直接回到$i$的一个环的路径,这个的最小值就是他对应的路径的最小环。
枚举每一个$k$,找到上面式子的最小值,就是整个图的最小环。
输出路径的话其实就是相当于一个dfs
注意点:
有重边,所以存的是边的最小值。
$d[i,j] + g[j,k] + g[k,i]$可能会在运算时超出int,因为可能有的两两节点之间没有边存在也就是inf
虐狗宝典阅读笔记:
对于有向图的最小环问题,可枚举起点$s = 1~n$,执行堆优化的Dijkstra算法求解单源最短路经。$s$一定是第一个被从堆中取出的节点,我们扫描$s$的所有出边,当扩展、更新完成后,令$d[s] = inf$,然后继续求解。当$s$第二次被从堆中取出时,$d[s]就是经过点$s$的最小环长度。
#include<iostream>
//#include<bits/stdc++.h>
#include<cstdio>
#include<cmath>
#include<cstdlib>
#include<cstring>
#include<algorithm>
#include<queue>
#include<vector>
#include<set>
#include<climits>
using namespace std;
typedef long long LL;
#define N 100010
#define pi 3.1415926535
#define inf 0x3f3f3f3f int n, m;
const int maxn = ;
int g[maxn][maxn], d[maxn][maxn], pos[maxn][maxn], ans;
vector<int>path; void get_path(int i, int j)
{
if(pos[i][j] == )return;
get_path(i, pos[i][j]);
path.push_back(pos[i][j]);
get_path(pos[i][j], j);
} void floyd()
{
ans = inf;
memcpy(d, g, sizeof(g));
for(int k = ; k <= n; k++){
for(int i = ; i < k; i++){
for(int j = i + ; j < k; j++){
if(ans > (long long)d[i][j] + g[j][k] + g[k][i]){
ans = d[i][j] + g[j][k] + g[k][i];
path.clear();
path.push_back(i);
get_path(i, j);
path.push_back(j);
path.push_back(k);
}
}
}
for(int i = ; i <= n; i++){
for(int j = ; j <= n; j++){
if(d[i][j] > d[i][k] + d[k][j]){
d[i][j] = d[i][k] + d[k][j];
pos[i][j] = k;
}
}
}
}
} int main()
{
while(scanf("%d%d", &n, &m) != EOF){
memset(g, 0x3f, sizeof(g));
memset(pos, , sizeof(pos));
for(int i = ; i <= n; i++){
g[i][i] = ;
}
for(int i = ; i < m; i++){
int u, v, w;
scanf("%d%d%d", &u, &v, &w);
g[u][v] = g[v][u] = min(g[u][v], w);
} floyd();
if(ans == inf){
printf("No solution.\n");
}
else{
for(int i = ; i < path.size(); i++){
printf("%d", path[i]);
if(i == path.size() - ){
printf("\n");
}
else{
printf(" ");
}
}
}
}
return ;
}
poj1734 Sightseeing trip【最小环】的更多相关文章
- poj1734 Sightseeing trip[最小环]
一个最小环裸题.最小环的两种求法dijkstra和Floyd直接参见这里我就是从这里学的,不想写了. 注意这里最重要的一个点是利用了Floyd的dp过程中路径上点不超过$k$这一性质,来枚举环上最大编 ...
- POJ1734 Sightseeing trip (Floyd求最小环)
学习了一下用Floyd求最小环,思路还是比较清晰的. 1 #include<iostream> 2 #include<cstdio> 3 #include<cstring ...
- poj1734 Sightseeing trip(Floyd求无向图最小环)
#include <iostream> #include <cstring> #include <cstdio> #include <algorithm> ...
- POJ1734 - Sightseeing trip
DescriptionThere is a travel agency in Adelton town on Zanzibar island. It has decided to offer its ...
- 「POJ1734」Sightseeing trip
「POJ1734」Sightseeing trip 传送门 这题就是要我们求一个最小环并且按顺序输出一组解. 考虑 \(O(n^3)\) 地用 \(\text{Floyd}\) 求最小环: 考虑 \( ...
- 「LOJ#10072」「一本通 3.2 例 1」Sightseeing Trip(无向图最小环问题)(Floyd
题目描述 原题来自:CEOI 1999 给定一张无向图,求图中一个至少包含 333 个点的环,环上的节点不重复,并且环上的边的长度之和最小.该问题称为无向图的最小环问题.在本题中,你需要输出最小环的方 ...
- 【poj1734】Sightseeing trip
Sightseeing trip Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 8520 Accepted: 3200 ...
- URAL 1004 Sightseeing Trip(最小环)
Sightseeing Trip Time limit: 0.5 secondMemory limit: 64 MB There is a travel agency in Adelton town ...
- poj 1734 Sightseeing trip判断最短长度的环
Sightseeing trip Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 5590 Accepted: 2151 ...
随机推荐
- 迷你音乐播放器v1.0正式上线!
迷你音乐播放器V1.0正式上线! 版本介绍: 1.随机播放切换开关(通过点击专辑图片) 2.通过拖动歌曲名及艺术家名调整歌曲播放进度 3.手机浏览访问支持熄屏播放 4.暂不支持在线搜索功能 快来一起分 ...
- 【Vegas原创】查询SQL Server更改记录的语句
指定数据库,然后: select Name,Create_date,Modify_Date from sys.objects where type in ('U','P', 'V','F', 'TR' ...
- 分库分表利器——sharding-sphere
背景 得不到的东西让你彻夜难眠,没有尝试过的技术让我跃跃欲试. 本着杀鸡焉用牛刀的准则,我们倡导够用就行,不跟风,不盲从. 所以,结果就是我们一直没有真正使用分库分表.曾经好几次,感觉没有分库分表(起 ...
- 物联网架构成长之路(13)-SpringBoot入门
1. 前言 下载最新版的JavaEE eclipse-jee-oxygen-2-win32-x86_64.zip 安装STS插件 Window->Eclipse Marketplace -> ...
- Total Command 常用快捷键
压缩和解压缩文件Alt + F5 压缩选定文件 Alt + F9 解压压缩文件Alt + Shift + F9 ...
- 《转》12个Sublime Text使用技巧
文为您提供Sublime Text编辑器的12个技巧和诀窍,深入挖掘这个看似简洁的代码编辑器,背后所隐藏的实现各种高级功能的无限可能. 1) 选择 以下是一些Sublime Text选择文本的快捷键: ...
- python修饰器(装饰器)以及wraps
Python装饰器(decorator)是在程序开发中经常使用到的功能,合理使用装饰器,能让我们的程序如虎添翼. 装饰器的引入 初期及问题的诞生 假如现在在一个公司,有A B C三个业务部门,还有S一 ...
- 怎样找回被删除的EXCEL
我使用的是腾讯管家进行文件恢复,步骤如下: (1)打开电脑管家,选择工具箱. (2)找到文件找回,点击. (3)选择恢复被删除的文件. (4)选择我们删除的文件. (5)文件还原后路径,点击“确认还原 ...
- iOS开发微信支付
现在基本所有的App都会接入支付宝支付以及微信支付,也有很多第三方提供给你 SDK帮你接入,但是这种涉及到支付的东西还是自己服务器搞来的好一些,其实搞懂了 逻辑非常的简单,下面直接给大家说说下基本流程 ...
- 【emWin】例程十二:FontCvt生成字库
介绍: 本例程介绍使用官方字库生成软件FontCvt5.22生成字库文件,并在液晶上显示文字. 实验指导书及代码包下载: 链接:http://pan.baidu.com/s/1eSkliDW 密码:o ...