poj3255

来源:互联网 发布:iis7怎么执行php 编辑:程序博客网 时间:2024/04/20 13:38

链接:点击打开链接

题意:求1到n的次短路是多少(次短路指的是比最短路长度长的次短的路径)

代码:

#include <iostream>#include <string.h>#include <algorithm>#include <stdio.h>#include <stdlib.h>#include <vector>#include <queue>#include <algorithm>#define INF 0x3f3f3f3fusing namespace std;struct node {int to,cost;};typedef pair<int,int>P;vector<node>G[5005];int dis1[5005],dis2[5005];int n,m;void dijkstra(int s){    int i,v,d,d2;    node temp;    priority_queue<P,vector<P>,greater<P> >que;    fill(dis1,dis1+n,INF);    fill(dis2,dis2+n,INF);    dis1[s]=0;    que.push(P(0,s));    while(!que.empty()){        P p=que.top();que.pop();        v=p.second;d=p.first;        if(dis2[v]<d)continue;        for(i=0;i<G[v].size();i++){            temp=G[v][i];            d2=temp.cost+d;            if(dis1[temp.to]>d2){                swap(dis1[temp.to],d2);                que.push(P(dis1[temp.to],temp.to));            }            if(dis1[temp.to]<d2&&dis2[temp.to]>d2){                dis2[temp.to]=d2;       //通过最短路也就是dis1数组将次短路保存到dis2数组,并入队                que.push(P(dis2[temp.to],temp.to));            }        }    }}                                       //dijkstra模板using namespace std;int main(){    int i,x,y,z;    node temp;    while(scanf("%d%d",&n,&m)!=EOF){        for(i=0;i<n;i++)        G[i].clear();        for(i=0;i<m;i++){            scanf("%d%d%d",&x,&y,&z);            temp.to=y-1,temp.cost=z;                //双向边             G[x-1].push_back(temp);            temp.to=x-1;            G[y-1].push_back(temp);                 }        dijkstra(0);        printf("%d\n",dis2[n-1]);    }    return 0;}

0 0
原创粉丝点击