zoukankan      html  css  js  c++  java
  • 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
  • 相关阅读:
    你的课程
    asp.net的ajax以及json
    asp.net自带的异步刷新控件使用
    基于.net mvc的校友录(源程序)
    基于.net mvc的校友录(七、文件上传以及多对多关系表的LINQ查询实现)
    基于.net mvc的校友录(六、codefirst的使用以及班级模块的关键部分实现)
    逻辑回归实例
    层次聚类
    k均值聚类
    数据处理与转换
  • 原文地址:https://www.cnblogs.com/shuzy/p/3783154.html
Copyright © 2011-2022 走看看