题目链接:http://poj.org/problem?id=3255

解题思路:

  昨晚两点多睡不着翻起来刷《挑战》的题,结果遇到这道求次短路的题,一脸懵逼。想了半小时没什么思路就看他的解答了。具体看代码吧,讲解可以参考《挑战程序设计竞赛》P119。其实还是Dijkstra算法的变形。但是这个变形确实不太好想。

AC代码:

 #include <iostream>
#include <cstdio>
#include <vector>
#include <queue>
using namespace std;
typedef pair<int,int> P;
const int maxn=+,inf=0x7ffffff;
struct edge{
int to,cost;
};
vector<edge> G[maxn];
int d[maxn],d2[maxn];
int main()
{
int N,R,A,B,D;
scanf("%d%d",&N,&R);
while(R--){
scanf("%d%d%d",&A,&B,&D);
edge temp;
temp.cost=D;
temp.to=B; G[A].push_back(temp);
temp.to=A; G[B].push_back(temp);
}
priority_queue<P,vector<P>,greater<P> > que;
for(int i=;i<=N;i++) d[i]=d2[i]=inf;
d[]=;
que.push(P(,));
while(!que.empty()){
P p=que.top(); que.pop();
int v=p.second;
if(d2[v]<p.first) continue; //如果次短路都比此短,那么就没有更新的必要了
for(int i=;i<G[v].size();i++){
edge e=G[v][i];
int dt=p.first+e.cost; //一开始那个p.first被我携程d[v]了,很显然有bug
if(d[e.to]>dt){
swap(d[e.to],dt);
que.push(P(d[e.to],e.to));
}
if(d2[e.to]>dt&&dt>d[e.to]){
d2[e.to]=dt;
que.push(P(d2[e.to],e.to));
}
}
}
printf("%d\n",d2[N]); return ;
}

最新文章

  1. HttpFox
  2. mysql分表的3种方法
  3. ASIHTTPRequest中数据压缩问题与gzip
  4. Ubuntu 14.04下搭建 Android 开发环境(1) -JDK安装
  5. 一个千万量级的APP使用的一些第三方库
  6. C# winform窗体设计-通过条件查询数据
  7. 在ubuntu上搭建开发环境2---Win7、Ubuntu双系统正确删除Ubuntu
  8. Excel jxl导入导出
  9. 海康威视 NET_DVR_FindNextFile 的错误
  10. CloudStack全局参数
  11. [Codeforces676B]Pyramid of Glasses(递推,DP)
  12. poj 1503 大数相加(java)
  13. css 优先级
  14. IOS 中常用站位符
  15. 《深入理解Java虚拟机》学习笔记(一)
  16. scrapy 爬取当当网产品分类
  17. Entity Framework Core 2.1,添加种子数据
  18. unittest测试套件
  19. 先装IIS后装.Net Framework
  20. 【python练习题】程序12

热门文章

  1. css之单位
  2. python的sqlalchemy框架
  3. EntityFramework 迁移遇到的问题
  4. Leo2DNT(雷傲论坛转DiscuzNT)1.0转换程序发布
  5. 数学--数论-- AtCoder Beginner Contest 151(组合数+数学推导)好题(๑•̀ㅂ•́)و✧
  6. linux多线程同步的四种方式
  7. RF(常用关键字)
  8. golang之channel
  9. Python基础01 集合
  10. 前端之HTML1