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