题意:求出1 -> n的次短路;

思路:

1.可以跑两遍最短路,从1 -> n 和 n -> 1,因为次短路肯定是替换最短路上的一条边后形成的,所以之后直接枚举每条边替换就行了。

2.在dijkstra的时候同时更新最短和次短,比较巧妙。

PS:两种思路在有向图中同样适用,不过思路一在跑n - > 1的时候要建反向图。

Code1:

#include<iostream>
#include<cstdio>
#include<queue>
#include<cstring>
using namespace std;
typedef long long ll;
const int maxn = 5000 + 10;
#define INF 0x3f3f3f3f
#define clr(x,y) memset(x,y,sizeof x)int n,m;
int edge_num;
int head[maxn];
int d1[maxn],d2[maxn];
struct Edge
{Edge(){}Edge(int x,int y,int z):to(x),w(y),next(z){}int to,w,next;
}edge[200000 + 10];
void Init()
{clr(head,-1);edge_num = 0;clr(d1,INF);clr(d2,INF);
}
void add_edge(int x,int y,int z)
{edge[edge_num] = Edge(y,z,head[x]);head[x] = edge_num ++;
}
bool vis[maxn];
void spfa(int s,int d[])
{clr(vis,false);d[s] = 0;queue<int>q;q.push(s);vis[s] = true;while(!q.empty()){int u = q.front();q.pop();vis[u] = false;for(int i = head[u];i != -1; i = edge[i].next){int v = edge[i].to,w = edge[i].w;if(d[v] > d[u] + w){d[v] = d[u] + w;if(!vis[v])vis[v] = true,q.push(v);}}}
}
void solve()
{int ans = INF;for(int i = 1; i <= n; i ++){for(int j = head[i];j != -1; j = edge[j].next){int v = edge[j].to,w = edge[j].w;if(d1[i] + d2[v] + w > d1[n])ans = min(ans,d1[i] + d2[v] + w);}}printf("%d\n",ans);
}
int main()
{while( ~ scanf("%d%d",&n,&m)){Init();while(m --){int x,y,z;scanf("%d%d%d",&x,&y,&z);add_edge(x,y,z);add_edge(y,x,z);}spfa(1,d1);spfa(n,d2);solve();}return 0;
}

Code2:

#include<iostream>
#include<cstdio>
#include<queue>
#include<cstring>
using namespace std;
typedef long long ll;
const int maxn = 5e3 + 10;
#define INF 0x3f3f3f3f
#define clr(x,y) memset(x,y,sizeof x)typedef pair<int,int> P;struct Node
{Node(int x,int y):to(x),val(y){}int to;int val;
};
int n,m;
vector<Node>v[maxn];
int dist[maxn],dist2[maxn];
void dijkstra()
{clr(dist,INF);clr(dist2,INF);priority_queue<P,vector<P>,greater<P> >q;dist[1] = 0;q.push(P(0,1));while(!q.empty()){P t = q.top();q.pop();int u = t.second;if(dist2[u] < t.first)continue;for(int i = 0; i < v[u].size(); i ++){int vs = v[u][i].to,cost = v[u][i].val;int d = t.first + cost;if(d < dist[vs]){swap(dist[vs],d);q.push(P(dist[vs],vs));}if(dist[vs] < d && dist2[vs] > d){dist2[vs] = d;q.push(P(dist2[vs],vs));}}}printf("%d\n",dist2[n]);
}
int main()
{while( ~ scanf("%d%d",&n,&m)){for(int i = 1; i <= n; i ++)v[i].clear();while(m --){int x,y,z;scanf("%d%d%d",&x,&y,&z);v[x].push_back(Node(y,z));v[y].push_back(Node(x,z));}dijkstra();}return 0;
}

poj3255次短路相关推荐

  1. POJ3255(次最短路)

    POJ3255 题意 某街区共有R条道路,N个路口道路可以双向通行.问1号路口到N号路口的次最短路长度是多少?同一条边可以经过多次. dis数组用来求最短路 dis2数组用来求次短路 思路 这道题找的 ...

  2. POJ3255 Roadblocks ——次短路

    Roadblocks 题意:求次短路 思路:见注释,用dijkstra同时维护最短路和次短路 // Decline is inevitable // Romance will last forever ...

  3. POJ 3255(迪杰斯特拉算法求次短路)

    POJ3255,问题是求节点1到n的次短路. 在dijkstra求最短路算法的基础上进行变形,用两个数组分别记录源点到各节点最短路径和次短路径: 每次更新时,都将最短路的节点及可能成为次短路的节点pu ...

  4. [C] [最短路] 只有5行的算法:Floyd-Warshall

    终于学到求最短路了,终于来到我最喜欢的算法--Floyd-Warshall了!今天还有点小激动呢! 我喜欢它,当然是因为它逻辑十分简单咯!真的只有5行诶! Floyd-Warshall算法 题目描述 ...

  5. BZOJ4152 AMPPZ2014 The Captain(最短路)

    事实上每次走到横坐标或纵坐标最接近的点一定可以取得最优方案.于是这样连边跑最短路就可以了. #include<iostream> #include<cstdio> #inclu ...

  6. Codeforces.1051F.The Shortest Statement(最短路Dijkstra)

    题目链接 先随便建一棵树. 如果两个点(u,v)不经过非树边,它们的dis可以直接算. 如果两个点经过非树边呢?即它们一定要经过该边的两个端点,可以直接用这两个点到 u,v 的最短路更新答案. 所以枚 ...

  7. BZOJ1491: [NOI2007]社交网络(Floyd 最短路计数)

    Time Limit: 10 Sec  Memory Limit: 64 MB Submit: 2343  Solved: 1266 [Submit][Status][Discuss] Descrip ...

  8. HDU1811 Rank of Tetris 拓扑排序+并查集 OR 差分约束最短路+并查集

    题目链接 题意:就是给你一堆关系,看能不能排出个确定的顺序 做法: 1. 拓扑排序+并查集 应该很容易想到的一种思路,大于小于建立单向边.对于相等的呢,就把他们缩成一个点.就用并查集缩成一个点就行了 ...

  9. E:By Elevator or Stairs? CF595 DP最短路

    题目链接 比赛的时候一看,这不是最短路吗,然后敲了一个最短路. 然后比赛完发现大家基本都写的dp,我真是个憨憨,dp3行 最短路就建个简单的图,dp就是从上一维转化过来就是了 优秀的dp: //#pr ...

最新文章

  1. 2021年大数据常用语言Scala(二十三):函数式编程 扁平化映射 flatMap
  2. android 应用状态,保持应用程序状态在Android上
  3. c语言判断x的个位数是否为5,用C语言编程从键盘输入一个正整数,判断其个位数是否为5,若是5则输出“yes”,否则输出“no”...
  4. 将byte数组转换成十进制字符串输出_outputStream与InputStream使用只能传输字节byte...
  5. 计算机科学技术学习引论
  6. 计算机启动硬盘引导过程,如何重建mbr|硬盘重建主引导记录(mbr)步骤
  7. 标准盒子模型简单讲解
  8. 手机qq2010java触屏_手机QQ2010(Java触屏)Beta2发布:操作更流畅
  9. Oracle安装以及彻底清除
  10. 【最新】Blender资产库纹理灯光 预设打光技巧
  11. 淘宝技术发展(Oracle/支付宝/旺旺)
  12. Android Apk签名修改V1,V2,V3,V4
  13. 【Android】二进制图片和Bitmap的getPixel方法解析
  14. 一些无线通信系统模型的概念
  15. Win7 英文专业版安装中文包汉化后部分软件中文乱码问题处理
  16. 三国志英杰传高级玩法
  17. STM32(三) ENC28J60以太网(一)
  18. 小红书素人KOC素人笔记种草传播如何做到专业不踩坑?
  19. 字符串转化为数字的函数
  20. gtx1060和gtx1660的差距 哪个好

热门文章

  1. 【Kettle Spoon】课程要点简记
  2. mongodb用哪些端口号_mongodb端口号(mongodb默认端口号)
  3. Python之父-Guido van Rossum
  4. 【文末送书】2022世界杯冠军预测,机器学习为你揭晓
  5. IBM计算机启动过程,ibm台式机bios设置u盘启动教程【图文教程】
  6. 教你挑选适合自己的蜂蜜
  7. 浅谈架构、操作系统、芯片的理解
  8. windows下修改黑苹果config_黑苹果家用PC安装苹果Mac OS操作系统经验(下)工具和资源...
  9. 麻省理工学院的计算机终端,“面纱(Veil)”系统:打造真正的无痕浏览
  10. spring-kuang