HDU 6181 Two Paths

来源:互联网 发布:软件的应用价值 编辑:程序博客网 时间:2024/05/21 06:28
答案为次短路或者最短路+和最短路相连或者最短路上的路径走两遍,怎么一开始大家都会啊
#include<stdio.h>#include<string.h>#include<algorithm>#include<queue>#include<iostream>using namespace std;typedef long long ll;const int MAXN =(int)1e5+10;const ll INF =(ll)1e11;struct edge{    int to,nxt;    ll w;}ed[MAXN<<1];int head[MAXN],cnt;void addedge(int u,int v,ll w){    ed[cnt].to=v;    ed[cnt].w=w;    ed[cnt].nxt=head[u];    head[u]=cnt++;}ll d1[MAXN],d2[MAXN];int lst[MAXN];struct node{    int s,u;ll dis;    node(){}node(int _s,int _u,ll _dis){s=_s;u=_u;dis=_dis;}    bool operator < (const node &a)const{        return dis>a.dis;    }};priority_queue<node>q;void dij(){    while(!q.empty()){        node now=q.top();q.pop();        int u=now.u,s=now.s;ll dis=now.dis;        if(d2[u]!=INF)continue;        if(d1[u]==INF){            d1[u]=dis;            lst[u]=s;        }        else {            d2[u]=dis;        }        for(int i=head[u];i!=-1;i=ed[i].nxt){            int v=ed[i].to;ll w=ed[i].w;            if(d2[v]!=INF)continue;            if(d2[v]>dis+w){                q.push(node(u,v,dis+w));            }        }            }}int main(){    int t;    scanf("%d",&t);    while(t--){        cnt=0;        int n,m;        scanf("%d%d",&n,&m);        for(int i=1;i<=n;i++)d1[i]=d2[i]=INF,lst[i]=0,head[i]=-1;        for(int i=1;i<=m;i++){            int u,v;ll w;            scanf("%d%d%lld",&u,&v,&w);            addedge(u,v,w);            addedge(v,u,w);        }        q.push(node(0,1,0));        dij();        ll ans=d2[n];        int now=n;        while(now!=0){            for(int i=head[now];i!=-1;i=ed[i].nxt){                ans=min(ans,d1[n]+ed[i].w*2);            }            now=lst[now];        }        printf("%lld\n",ans);    }    return 0;}

原创粉丝点击