一、题目

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: AB, 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 次短路径的更多相关文章

  1. POJ - 3255 次短路径

    题意:给你无向带权图,求次短路径 题解:加一个次短路的数组,用于距记录源点到此点的次短路长度,注意初始化是源点到自己的次短路是极大值 接着再使用dijkstra算法,它是每次选用现在连上(记录了)的点 ...

  2. POJ 3255 Roadblocks (Dijkstra求最短路径的变形)(Dijkstra求次短路径)

    Roadblocks Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 16425   Accepted: 5797 Descr ...

  3. POJ - 3255 SPFA+邻接表求次短路径

    题意:给出m条边 , n个顶点,u [ i ]到v [ i ] 的距离w [ i ],求除了最短路的那条最短的边的长度. 思路:之前有做过相似的题,使用迪杰斯特拉算法求单源最短路径,并且记录路径,枚举 ...

  4. 学习笔记CB006:依存句法、LTP、n元语法模型、N-最短路径分词法、由字构词分词法、图论、概率论

    依存句法分析,法国语言学家L.Tesniere1959年提出.句法,句子规则,句子成分组织规则.依存句法,成分间依赖关系.依赖,没有A,B存在错误.语义,句子含义. 依存句法强调介词.助词划分作用,语 ...

  5. 单源次短路径:poj:3255-Roadblocks

    Roadblocks Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 17521 Accepted: 6167 Descripti ...

  6. 次最短路径 POJ 3255 Roadblocks

    http://poj.org/problem?id=3255 这道题还是有点难度 要对最短路径的算法非常的了解 明晰 那么做适当的修改 就可以 关键之处 次短的路径: 设u 到 v的边权重为cost ...

  7. POJ 3255 Roadblocks(A*求次短路)

    Roadblocks Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 12167   Accepted: 4300 Descr ...

  8. MST:Roadblocks(POJ 3255)

       路上的石头 题目大意:某个街区有R条路,N个路口,道路双向,问你从开始(1)到N路口的次短路经长度,同一条边可以经过多次. 这一题相当有意思,现在不是要你找最短路径,而是要你找次短路经,而且次短 ...

  9. poj 3255 求次大最短路

    Roadblocks Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 5508   Accepted: 2088 Descri ...

随机推荐

  1. PHP中const,static,public,private,protected的区别

    原文地址:http://small.aiweimeng.top/index.php/archives/54.html const: 定义常量,一般定义后不可改变static: 静态,类名可以访问pub ...

  2. A1084

    输入:只能输入A-Z(不区分大小写),0-9和下划线: 第一行输入应输入字符串,第二行输入实际输入字符串. 输出:按大写输出缺少的字符,每个字符输出一次. 注意: 1.由于不区分大小写,则需要将小写字 ...

  3. filebeat 插件开发

      filebeat是一个轻量的日志收集工具,全套使用go语言开发.   我目前遇到的问题是,在收集的时候需要对数据进行采样,采样比和采样形式要灵活,因为可能在多个项目会使用到这个日志收集功能.刚开始 ...

  4. 洛谷 1938 [USACO09NOV]找工就业Job Hunt

    洛谷 1938  [USACO09NOV]找工就业Job Hunt 题目描述 Bessie is running out of money and is searching for jobs. Far ...

  5. P3704 [SDOI2017]数字表格

    P3704 [SDOI2017]数字表格 链接 分析: $\ \ \ \prod\limits_{i = 1}^{n} \prod\limits_{j = 1}^{m} f[gcd(i, j)]$ $ ...

  6. angular 服务 service factory provider constant value

    angular服务 服务是对公共代码的抽象,由于依赖注入的要求,服务都是单例的,这样我们才能到处注入它们,而不用去管理它们的生命周期. angular的服务有以下几种类型: 常量(Constant): ...

  7. 【Java源码解析】ThreadLocal

    简介 线程本地变量,用于同一线程之间的传递.每一个线程对象都保存在两个ThreadLocalMap,threadLocals和inheritableThreadLocals,后者会继承父线程的本地变量 ...

  8. ARP 地址分类 NAT技术

    第1章 OSI回顾 1.1 TCP/IP协议族组成 应用层 主机到主机层   互联网层   网络接入层 1.2 总结应用层掌握的协议与端口号对应关系 http(80) telnet(23) ftp(2 ...

  9. linux 查看服务器序列号

    1.安装工具 dmidecode yum install dmidecode -y 2.使用 dmidecode -t  1

  10. Centos7+安装python3+wkhtmltoPdf+pdfkit

    前言 这几天要做一个将HTML转化为PDF的小功能.期间经历了颇多的挫折,刚开始是通过java做的,后来发现java库做这个事情实在是效果不理想,前端做好了样式转完之后会出现很多问题.后来我想起来py ...