Roadblocks (次短路)(Dijkstra应用)

来源:互联网 发布:大数据适合学什么专业 编辑:程序博客网 时间:2024/06/06 01:24

到某个顶点的次短路要么是到其他某个顶点u的最短路加上u->v的边,或者是到u的次短路加上u->v

#include<stdio.h>#include<iostream>#include<vector>using namespace std;#include<algorithm>#include<string.h>#include<algorithm>#include<queue>#define maxn 5010const int INF = 1000000000;int N,R;//顶点数,边数int dis[maxn],dis2[maxn];struct edge{    int to,cost;    edge() {}    edge(int x,int y)    {        to=x;cost=y;    }};typedef pair<int ,int>P;vector<edge>G[maxn];int dist[maxn];int dist2[maxn];void dijkstra(int s) {    priority_queue<P,vector<P>,greater<P> >que;    for(int i=0;i<=N;i++) dist[i]=INF;    for(int i=0;i<=N;i++) dist2[i]=INF;    dist[s]=0;    que.push(P(0,s));    while(!que.empty()) {        P p=que.top(); que.pop();        int v=p.second, d=p.first;        if(dist2[v]<d) continue;  //v的次短距离比d还小        for(int i=0;i<G[v].size();++i) {            edge e=G[v][i];            //cout<<e.to<<endl;            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;                //cout<<d2<<endl;                que.push(P(dist2[e.to],e.to));            }        }    }    printf("%d\n",dist2[N]);}int main(){    int a,b,c;     scanf("%d%d",&N,&R);     for(int 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));     }     dijkstra(1);     return 0;}

附Dijkstra算法

struct edge{    int to,cost;};int V;vector<edge>G[maxn];int d[maxn];void dijkstra(int s){    priority_queue<P,vector<P>,greater<P> >;    fill(d,d+V,INF);    d[s]=0;    que.push(P(0,s));    while(!que.empty())    {        P p=que.top();que.pop();        int v=p.second;        if(d[v]<p.first) continue;        for(int i=0;i<G[i].size();i++)        {            edge e=G[v][i];            if(d[e.to]>d[v]+e.cost)            {                d[e.to]=d[v]+e.cost;                que.push(P(d[e.to],e.to));            }        }    }}


0 0
原创粉丝点击