POJ3255--次短路
求1到N的次短路,到某个顶点v的次短路有两种可能,一是到其他某个顶点u的最短路+edge(u,v)二是到其他某个点u的次短路+edge(u,v);
因此在松弛的时候不仅要记录最短路,同时也要记录次短路
#include<cstdio>
#include<iostream>
#include<algorithm>
#include<vector>
#include<cstring>
#include<string>
#include<queue>
#define INF 1e6
using namespace std;
const int maxn = ;
struct node
{
int d,u;
bool operator < (const node& rhs) const{
return d > rhs.d;
}
};
struct Edge
{
int from,to,dist;
Edge(int u,int v,int d):from(u),to(v),dist(d){}
}; int n,m;
vector<Edge> edges;//保存边的信息
vector<int> g[maxn];//保存的边在edges数组里的编号;
int d[maxn],d2[maxn];//最短距离,次短距离 void addedge(int from,int to,int dist)//跟刘汝佳学的。。
{
edges.push_back((Edge){from,to,dist});
edges.push_back((Edge){to,from,dist});
int k = edges.size();
g[from].push_back(k-);
g[to].push_back(k-);
} void dijkstra(int s)
{
priority_queue<node> que;
for(int i = ; i <= n; ++i){ d[i] = d2[i]= INF;}
d[s] = ; que.push((node){,s});
while(!que.empty())
{
node x = que.top();que.pop();
int u = x.u;
if(d2[u] < x.d) continue;//如果次短距离比这个节点的d值还小。。说明没有更新的必要
for(int i = ; i < g[u].size(); ++i)
{
Edge& e = edges[g[u][i]];
int p = x.d + e.dist;//待更新的值,从这个节点进行松弛操作,注意这里的x.d可能是最短距离也可能是次短距离。
if(d[e.to] > p)
{
swap(d[e.to],p);//如果最短距离比这个P还大,那么要换一换这个值;这样可以省掉一些讨论
que.push((node){d[e.to],e.to});
}
if(d2[e.to] > p&&d[e.to] < p)//这种p值介于最短与次短之间时要更新次短的距离。
{
d2[e.to] = p;
que.push((node){d2[e.to],e.to});//次短也可能对以后的结果有影响,所以也加入队列。
}
}
}
}
int main()
{
//freopen("in","r",stdin);
scanf("%d%d",&n,&m);
int from,to,dist;
for(int i = ; i < m; ++i)
{
scanf("%d%d%d",&from,&to,&dist);
addedge(from,to,dist);
}
dijkstra();
cout<<d2[n]<<endl;
}
POJ3255--次短路的更多相关文章
- POJ3255次短路
POJ3255 题意:给定一个图,求从1到n的次短路 分析:我们需要在dijkstra上作出一些修改,首先,到某个顶点v的次短路要么是到其他某个顶点u的最短路在加上u到v的边,要么是到v的次短路再加上 ...
- POJ-3255 Roadblocks---Dijkstra队列优化+次短路
题目链接: https://vjudge.net/problem/POJ-3255 题目大意: 给无向图,求1到n的次短路长度 思路: 由于边数较多,应该使用dijkstra的队列优化 用d数组存储最 ...
- POJ3255 Roadblocks [Dijkstra,次短路]
题目传送门 Roadblocks Description Bessie has moved to a small farm and sometimes enjoys returning to visi ...
- 【POJ3255/洛谷2865】[Usaco2006 Nov]路障Roadblocks(次短路)
题目: POJ3255 洛谷2865 分析: 这道题第一眼看上去有点懵-- 不过既然要求次短路,那估计跟最短路有点关系,所以就拿着优先队列优化的Dijkstra乱搞,搞着搞着就通了. 开两个数组:\( ...
- 算法复习———dijkstra求次短路(poj3255)
题目: Description Bessie has moved to a small farm and sometimes enjoys returning to visit one of her ...
- poj3255 Roadblocks 次短路
Roadblocks Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 10098 Accepted: 3620 Descr ...
- POJ3255 Roadblocks 严格次短路
题目大意:求图的严格次短路. 方法1: SPFA,同时求单源最短路径和单源次短路径.站在节点u上放松与其向量的v的次短路径时时,先尝试由u的最短路径放松,再尝试由u的次短路径放松(该两步并非非此即彼) ...
- POJ3255(次最短路)
描述 求1到n的次最短路 开个\(dis[maxn][2]\)的储存距离的二维数组,0储存最短路,1储存次短路 初始化全为正无穷,\(dis[1][0]=0;\) 然后遍历更新时,先尝试更新最短路和次 ...
- 《挑战程序设计竞赛》2.5 最短路 AOJ0189 2249 2200 POJ3255 2139 3259 3268(5)
AOJ0189 http://judge.u-aizu.ac.jp/onlinejudge/description.jsp?id=0189 题意 求某一办公室到其他办公室的最短距离. 多组输入,n表示 ...
- POJ3255 Roadblocks 【次短路】
Roadblocks Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 7760 Accepted: 2848 Descri ...
随机推荐
- [IOS]包含增删改查移动的tableView展示+plist文件保存+程序意外退出保存Demo
做一个tableView,包含增删改移动功能,并且修改值的时候,在按home键的时候会自动保存.如果可以的话使者保存自定义的类数组保存到plist中. 实现步骤: 1.创建一个SingleViewAp ...
- editplus配置详:
1:设置删除整行快捷键 2:设置背景颜色 3:php 开发环境 在 http://download.csdn.net/detail/vspeter/6002287 下载 editplus 的php语法 ...
- HDU 4444 Walk (离散化建图+BFS+记忆化搜索) 绝对经典
题目地址:http://acm.hdu.edu.cn/showproblem.php?pid=4444 题意:给你一些n个矩形,给你一个起点,一个终点,要你求从起点到终点最少需要转多少个弯 题解:因为 ...
- WPF - 为什么不能往Library的工程中添加WPF window
项目中添加一个Library 工程,但是却无法加入WPF window, WPF customize control. 调查了一下,发现这一切都由于Library工程中没有:ProjectTypeGu ...
- hdu 4790 Just Random (思路+分类计算+数学)
Problem Description Coach Pang and Uncle Yang both love numbers. Every morning they play a game with ...
- NetAnalyzer笔记 之 八 NetAnalyzer2016使用方法(2)
[创建时间:2016-05-06 22:07:00] NetAnalyzer下载地址 在写本篇的时候,NetAnalyzer 3.1版本已经发布,所以本篇就以最新版本的为例继续使用,并且顺带说明一下, ...
- Django之上传文件
使用Form表单上传文件 upload.html <!DOCTYPE html> <html lang="en"> <head> <met ...
- Hibernate的查询 HQL查询 查询某几列
HQL 是Hibernate Query Language的简写,即 hibernate 查询语言:HQL采用面向对象的查询方式.HQL查询提供了更加丰富的和灵活的查询特性,因此Hibernate将H ...
- 在sae配置django项目
1:使用sae开发必须有sae帐号,自己注册吧: 2:在sae上新建立一个python项目: 3:建立完成之后新建一个版本,即版本1: 4:获取svn的地址在eclipse中check下来: 5:注意 ...
- android 点击桌面图标,打开手机浏览器进入对应的站点
做一个假的adnroid app.要实现点击桌面图标.打开手机浏览器进入对应的站点,实现方法非常easy import android.app.Activity; import android.con ...