求最短路即次短路模板,一条边可以重复走的HDU6181

来源:互联网 发布:怎么自己开淘宝网店 编辑:程序博客网 时间:2024/05/17 07:12
#include<stdio.h>#include<string.h>#include<stdlib.h>#include<math.h>#include<iostream>#include<algorithm>#include<vector>#include<queue>#define MAXSIZE 100010#define INF 1e18#define LL long longusing namespace std;//int ans,n,k,a[MAXSIZE],dist1[MAXSIZE],dist2[MAXSIZE],vis[MAXSIZE];int n, k, a[MAXSIZE];LL ans, dist1[MAXSIZE], dist2[MAXSIZE];bool vis[MAXSIZE];typedef pair<LL, int>p;//p.second储存节点:u,p.frist储存s->u的当前最短距离struct node{    int u;    int v;    LL w;    int next;}G[MAXSIZE * 2];void Add(int u,int v,LL w){    G[k].u=u;    G[k].v=v;    G[k].w=w;    G[k].next=a[u];    a[u]=k++;}void bfs(){    priority_queue<p,vector<p>,greater<p> > Q;    dist1[1]=0;    Q.push(p(0,1));    while(!Q.empty())//可以发现这里没有vis数组,    {        p k=Q.top();        Q.pop();        int u=k.second;        LL d=k.first;        if(dist2[u] < d) //小优化:如果取出的不是最短距离就不再向下进行           continue;        for(int i=a[u];i!=-1;i=G[i].next)        {            int v=G[i].v;            LL d2=d+G[i].w;            if(dist1[v] > d2) //更新最短路            {                swap(dist1[v],d2);                Q.push(p(dist1[v],v));            }            if(dist2[v] >= d2 && dist1[v]<=d2)//更新次短路            {                dist2[v]=d2;                Q.push(p(dist2[v],v));            }        }    }    ans=dist2[n];}void Init(){    for(int i=0;i<MAXSIZE;i++)    {        dist1[i]=INF;        dist2[i]=INF;        vis[i] = false;        a[i]=-1;    }    k=1;}int main(){    int T,u,v,m;    LL w;    scanf("%d",&T);    while(T--)    {        scanf("%d%d",&n,&m);        Init();        while(m--)        {            scanf("%d%d%lld",&u,&v,&w);            Add(u,v,w);            Add(v,u,w);        }        bfs();        printf("%lld\n", ans);    }    return 0;}

阅读全文
0 0
原创粉丝点击