【图论】POJ-3255 次短路径
一、题目
Description
Bessie has moved to a small farm and sometimes enjoys returning to visit one of her best friends. She does not want to get to her old home too quickly, because she likes the scenery along the way. She has decided to take the second-shortest rather than the shortest path. She knows there must be some second-shortest path.
The countryside consists of R (1 ≤ R ≤ 100,000) bidirectional roads, each linking two of the N (1 ≤ N ≤ 5000) intersections, conveniently numbered 1..N. Bessie starts at intersection 1, and her friend (the destination) is at intersection N.
The second-shortest path may share roads with any of the shortest paths, and it may backtrack i.e., use the same road or intersection more than once. The second-shortest path is the shortest path whose length is longer than the shortest path(s) (i.e., if two or more shortest paths exist, the second-shortest path is the one whose length is longer than those but no longer than any other path).
Input
Line 1: Two space-separated integers: N and R
Line 1: Two space-separated integers: N and R
Lines 2..R+1: Each line contains three space-separated integers: A, B, and D that describe a road that connects intersections A and B and has length D (1 ≤ D ≤ 5000)
Output
Line 1: The length of the second shortest path between node 1 and node N
Sample Input
4 4
1 2 100
2 4 200
2 3 250
3 4 100
Sample Output
450
Hint
Two routes: 1 -> 2 -> 4 (length 100+200=300) and 1 -> 2 -> 3 -> 4 (length 100+250+100=450)
二、思路&心得
- 定义权值的最大值时,尽可能大,综合题目的条件,比如这题的MAX_D就应该大于两倍的D最大值
- 注意题目条件:比如这题存在自环边、双向边,同一条道路可以经过
- 图论中,注意根据题目图的特点选择对应的算法,比如这题为稀疏图,应选择邻接表进行表示图
三、代码
#include<cstdio>
#include<vector>
#include<algorithm>
#define MAX_SIZE 5005
#define MAX_D 10005
using namespace std;
struct edge {
int to, cost;
};
vector<edge> G[MAX_SIZE];
int N, R;
int dist[MAX_SIZE];
int dist2[MAX_SIZE];
int visit[MAX_SIZE];
int visit2[MAX_SIZE];
void Dijkstra(int s) {
dist[s] = 0;
while (true) {
int min_D = MAX_D;
int index;
int d, flag = 0;
for (int j = 1; j <= N; j ++) {
if (!visit[j] && dist[j] < min_D) {
min_D = dist[j];
index = j;
flag = 1;
} else if (!visit2[j] && dist2[j] < min_D) {
min_D = dist[j];
index = j;
flag = 2;
}
}
if (!flag) break;
else if (flag == 1) {
visit[index] = 1;
d = dist[index];
}
else if (flag == 2) {
visit2[index] = 1;
d = dist2[index];
}
for (int k = 0; k < G[index].size(); k ++) {
edge e = G[index][k];
int temp = e.cost + d;
if (!visit[e.to] && temp < dist[e.to]) {
swap(dist[e.to], temp);
}
if (dist[e.to] < temp && temp < dist2[e.to]) {
dist2[e.to] = temp;
visit2[e.to] = 0;
}
}
}
printf("%d\n", dist2[N]);
}
void solve() {
for (int i = 1; i <= N; i ++) {
visit[i] = 0;
visit2[i] = 1;
dist[i] = MAX_D;
dist2[i] = MAX_D;
G[i].clear();
}
int from;
edge e;
for (int i = 1; i <= R; i ++) {
scanf("%d %d %d", &from, &e.to, &e.cost);
G[from].push_back(e);
swap(from, e.to);
G[from].push_back(e);
}
Dijkstra(1);
}
int main() {
while (~scanf("%d %d", &N, &R)) {
solve();
}
return 0;
}
【图论】POJ-3255 次短路径的更多相关文章
- POJ - 3255 次短路径
题意:给你无向带权图,求次短路径 题解:加一个次短路的数组,用于距记录源点到此点的次短路长度,注意初始化是源点到自己的次短路是极大值 接着再使用dijkstra算法,它是每次选用现在连上(记录了)的点 ...
- POJ 3255 Roadblocks (Dijkstra求最短路径的变形)(Dijkstra求次短路径)
Roadblocks Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 16425 Accepted: 5797 Descr ...
- POJ - 3255 SPFA+邻接表求次短路径
题意:给出m条边 , n个顶点,u [ i ]到v [ i ] 的距离w [ i ],求除了最短路的那条最短的边的长度. 思路:之前有做过相似的题,使用迪杰斯特拉算法求单源最短路径,并且记录路径,枚举 ...
- 学习笔记CB006:依存句法、LTP、n元语法模型、N-最短路径分词法、由字构词分词法、图论、概率论
依存句法分析,法国语言学家L.Tesniere1959年提出.句法,句子规则,句子成分组织规则.依存句法,成分间依赖关系.依赖,没有A,B存在错误.语义,句子含义. 依存句法强调介词.助词划分作用,语 ...
- 单源次短路径:poj:3255-Roadblocks
Roadblocks Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 17521 Accepted: 6167 Descripti ...
- 次最短路径 POJ 3255 Roadblocks
http://poj.org/problem?id=3255 这道题还是有点难度 要对最短路径的算法非常的了解 明晰 那么做适当的修改 就可以 关键之处 次短的路径: 设u 到 v的边权重为cost ...
- POJ 3255 Roadblocks(A*求次短路)
Roadblocks Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 12167 Accepted: 4300 Descr ...
- MST:Roadblocks(POJ 3255)
路上的石头 题目大意:某个街区有R条路,N个路口,道路双向,问你从开始(1)到N路口的次短路经长度,同一条边可以经过多次. 这一题相当有意思,现在不是要你找最短路径,而是要你找次短路经,而且次短 ...
- poj 3255 求次大最短路
Roadblocks Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 5508 Accepted: 2088 Descri ...
随机推荐
- 嵌入式C语言自我修养 03:宏构造利器:语句表达式
3.1 基础复习:表达式.语句和代码块 表达式 表达式和语句是 C 语言中的基础概念.什么是表达式呢?表达式就是由一系列操作符和操作数构成的式子.操作符可以是 C 语言标准规定的各种算术运算符.逻辑运 ...
- Ajax第一天——入门与基本概念
什么是Ajax Ajax被认为是(Asynchronous JavaScript and XML的缩写).异步的js和xml 异步和同步:同步->类似打电话,接完一个再接下一个:异步:-> ...
- VB6 Common Dialog
'---------------------------- 'Class CommonDialog 'Member of MSComDlg '---------------------------- ...
- 6 [面向对象]-property
1.特性(property) 什么是特性property property是一种特殊的属性,访问它时会执行一段功能(函数)然后返回值 例一:BMI指数(bmi是计算而来的,但很明显它听起来像是一个属性 ...
- [TJOI2014]Alice and Bob[拓扑排序+贪心]
题意 给出一个序列的以每一项结尾的 \(LIS\) 的长度a[],求一个序列,使得以每一项为开头的最长下降子序列的长度之和最大. \(n\leq 10^5\) . 分析 最优解一定是一个排列,因为如果 ...
- PersistentAliasAttribute & CalculatedAttribute & CalculatedPersistentAliasAttribute
一,PersistentAliasAttribute-[XPO提供] Indicates that a property is not persistent and its value is calc ...
- Charles 抓包使用教程
将 Charles 设置成系统代理 Charles 主界面介绍 过滤网络请求 截取 iPhone 上的网络封包 截取 Https 通讯信息 模拟慢速网络 修改网络请求内容 给服务器做压力测试 修改服务 ...
- JAVA枚举操作(获取值,转map集合)
JAVA枚举相对来说比.NET的枚举功能强大,感觉就像是一种简化版的类对象,可以有构造方法,可以重载,可以继承接口等等,但不能继承类,JAVA枚举在实际开发中应用相当频繁,以下几个封装方法在实际开发中 ...
- jQuery中turn.js(翻页效果)学习笔记
Turn.js是一个内置的jQuery翻页插件1 html中引入<script type="text/javascript" src="js/turn.js&quo ...
- if _ else if _ else,case,程序逻辑判断- java基础
//单个判端 if(){ } //双判端 if(){ }else{ } //多重判端 if(){ }else if(){ }else if(){ }else{ } package test1; // ...