• POJ3255 次短路


    3255

    利用最短路的思想,最短路是维护每个节点到起点的最短距离,每次确定未确定里面距离最短的那个节点的最短距离,

    根据次短路定义,从S到u的第二短的路线,那么只要维护一下次短路就可以了。新的节点次短路要么是S->u最短路+u->v

    要么是 S->u次短路+ u->v  就是{d[e.to],d2[e.to] c+e.w}里面最短的是最短路 第二小的是次短路

     1 #include <iostream>
     2 #include <cstdio>
     3 #include <cstring>
     4 #include <set>
     5 #include <algorithm>
     6 #include <map>
     7 #include <queue>
     8 #include<vector>
     9 #define maxn 5010
    10 #define maxm 12500010
    11 #define INF 0x3fffffff
    12 using namespace std;
    13 struct edge {
    14     int to,w;
    15     edge(){}
    16     edge(int _to,int _w){
    17         to=_to;w=_w;
    18     }
    19 };
    20 typedef pair<int,int> P;
    21 int V;
    22 vector<edge> G[maxn];
    23 int d[maxn];//最短路
    24 int d2[maxn];//次短路
    25 void dijkstra(int s){
    26     priority_queue<P,vector<P>,greater<P> >q;
    27     for(int i=0;i<V;++i){
    28         d[i]=INF;
    29         d2[i]=INF;
    30     }
    31     d[s]=0;
    32     q.push(P(d[s],s));
    33     while(!q.empty()){
    34         P p = q.top();
    35         q.pop();
    36         int v = p.second,c=p.first;
    37         if(d2[v]<p.first)continue;
    38         for(int i=0;i<G[v].size();++i){
    39             edge e = G[v][i];
    40             int c2 = c+e.w;//新的权值
    41             if(d[e.to]>c2){//维护最短路
    42                 swap(d[e.to],c2);
    43                 q.push(P(d[e.to],e.to));
    44             }
    45             if(d2[e.to]>c2&&d[e.to]<c2){//维护次短路
    46                 d2[e.to]=c2;
    47                 q.push(P(d2[e.to],e.to));
    48             }
    49         }
    50     }
    51 }
    52 int main (){
    53     int n,m;
    54     while(scanf("%d%d",&n,&m)!=EOF){
    55         for(int i=0;i<n;++i)G[i].clear();
    56         V=n;
    57         if(n==0&&m==0)break;
    58         int u,v,w;
    59         for(int i=0;i<m;++i){
    60             scanf("%d%d%d",&u,&v,&w);
    61             G[u-1].push_back(edge(v-1,w));
    62             G[v-1].push_back(edge(u-1,w));
    63         }
    64         dijkstra(0);
    65         printf("%d
    ",d2[n-1]);
    66     }
    67 }
    View Code
  • 相关阅读:
    java 获取文本一行一行读
    postman 测试api接口
    MariaDB 默认是禁止远程访问的 我们改掉它
    mysql 查询近三个月数据
    Springboot配置拦截器
    springboot 基于@Scheduled注解 实现定时任务
    springboot 配置访问本地图片
    springboot上传文件大小限制的配置
    vue中toggle切换的3种写法
    vue怎么给自定义组件绑定原生事件
  • 原文地址:https://www.cnblogs.com/shuzy/p/3783154.html
Copyright © 2020-2023  润新知