POJ3255(次最短路)

描述

求1到n的次最短路

开个\(dis[maxn][2]\)的储存距离的二维数组,0储存最短路,1储存次短路

初始化全为正无穷,\(dis[1][0]=0;\)

然后遍历更新时,先尝试更新最短路和次短路,不行就尝试更新次短路;

如果入队的距离已经大于次短路的距离,那么没必要继续,continue;

#include <iostream>
#include <cstring>
#include <cstdio>
#include <queue>
#include <algorithm>
using namespace std;
const int inf=999999999;
const int maxn=200009;
struct node{
	int to,nxt,w;
}d[maxn];int head[maxn],cnt=1,dis[maxn][3],n,m;
void add(int u,int v,int w){
	d[cnt].nxt=head[u],d[cnt].to=v,d[cnt].w=w,head[u]=cnt++;
}
typedef pair<int,int>p;//最短路和顶点编号 
void dij(int s)
{
	priority_queue<p,vector<p>,greater<p> >q;//默认小的先出来
	for(int i=0;i<=n;i++)	dis[i][0]=dis[i][1]=inf;
	dis[1][0]=0;q.push(p(0,1));
	while(!q.empty())
	{
		p ans=q.top();q.pop();
		int lu=ans.first,v=ans.second;
		if(dis[v][1]<lu)	continue;
		for(int i=head[v];i;i=d[i].nxt)
		{
			node e=d[i];
			int dd=lu+e.w;
			if(dis[e.to][0]>dd)//更新最短路
			{
				swap(dis[e.to][0],dd);
				q.push(p(dis[e.to][0],e.to));
			//如果比最短路短,就把最短路给次短路,dd给最短路
			//如果不比次短路短,也会到下一个if去尝试更新次短路 
			}
			if(dis[e.to][1]>dd&&dis[e.to][0]<dd)
			{
				dis[e.to][1]=dd;
				q.push(p(dd,e.to));
			}	
		}
	}
	cout<<dis[n][1]<<endl; 
}
using namespace std;
int main()
{
	while(cin>>n>>m)
	{
		for(int i=1;i<=m;i++)
		{
			int l,r,w;
			cin>>l>>r>>w;
			add(l,r,w);add(r,l,w);
		}
		dij(1);
	}
	return 0;
}
posted @ 2020-04-01 10:02  倾叶子佮  阅读(156)  评论(0编辑  收藏  举报