poj 3255

来源:互联网 发布:短信平台群发软件 编辑:程序博客网 时间:2024/06/06 12:52

《挑战程序设计竞赛》 例题

求次短路  先求最短路

再更新


#include<cstdio>#include<cstring>#include<algorithm>#include<vector>#include<map>#include<cmath>#include<queue>#include<iostream>using namespace std;const int maxn = 5000 + 5;const int INF = 100000000;typedef long long LL;typedef pair<int,int> P;int n,r;struct edge{    int to,cost;};vector<edge> G[maxn];int dist[maxn];int dist2[maxn];void solve(){    priority_queue<P,vector<P>,greater<P> > que;    fill(dist,dist+n,INF);    fill(dist2,dist2+n,INF);    dist[0] = 0;    que.push(P(0,0));    while(!que.empty()){        P p = que.top();que.pop();        int v = p.second,d = p.first;        if(dist2[v] < d ) continue;        for(int i = 0;i < G[v].size();i++){            edge &e = G[v][i];            int d2 = d + e.cost;            if(dist[e.to] > d2){                swap(dist[e.to],d2);                que.push(P(dist[e.to],e.to));            }            if(dist2[e.to] > d2 && dist[e.to] < d2){                dist2[e.to] = d2;                que.push(P(dist2[e.to],e.to));            }        }    }    printf("%d\n",dist2[n-1]);}int main(){    while(scanf("%d%d",&n,&r) != EOF){        for(int i = 0;i <= n;i++) G[i].clear();        for(int i = 0;i < r;i++){            int x,y,z;            scanf("%d%d%d",&x,&y,&z);            x--;y--;            G[x].push_back(edge{y,z});            G[y].push_back(edge{x,z});        }        solve();    }    return 0;}

0 0
原创粉丝点击