poj 3255 Roadblocks(次短路)

题意:一幅带权无向图求次短路;

思路:每次维护最短路和次短路,先更新最短再更新次短;求次短路径的长度;

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<vector>
#include<queue>
using namespace std;
#define INF 0x3f3f3f3f
typedef pair<int,int>P;
int N,R;
struct edge{
    int to,cost;
    edge(int a,int b){
      to=a;cost=b;
    }
};
vector<edge> G[500010];
int dist[500010];  //最短路
int dist2[500010]; //次短路
void solve(){
   priority_queue<P,vector<P>,greater<P> > que;
   fill(dist+1,dist+N+1,INF);
   fill(dist2+1,dist2+N+1,INF);
   dist[1]=0;
   que.push(P(0,1));
   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]);
}
int main()
{
   int i,j,k,a,b,c;
   while(scanf("%d%d",&N,&R)!=EOF){
    memset(G,0,sizeof(G));
    for(i=0;i<R;i++){
        scanf("%d%d%d",&a,&b,&c);
       G[a].push_back(edge(b,c));
       G[b].push_back(edge(a,c));
    }
    solve();
   }
   return 0;
}

 

posted @ 2015-08-10 13:18  dominating大树置林  Views(181)  Comments(0)    收藏  举报