zoukankan      html  css  js  c++  java
  • 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;
    }
    
  • 相关阅读:
    PL/SQL 训练05--游标
    PL/SQL 训练04--事务
    PL/SQL 训练03 --异常
    PL/SQL 训练02--集合数组
    PL/SQL 训练01--基础介绍
    25 mysql怎么保证高可用
    pt工具之pt-archiver
    Oracle日常性能问题查看
    Oracle的cursor
    Oracle 索引扫描的几种情况
  • 原文地址:https://www.cnblogs.com/iss-ue/p/12610659.html
Copyright © 2011-2022 走看看