hdu 6181 Two Paths (次短路)

来源:互联网 发布:sendto目标端口号 编辑:程序博客网 时间:2024/05/18 03:40

当时再搬宿舍,2点多看了下,特困,看了别人说次短路,我只做过次小生成树,没做过这个,提交了个模板就睡觉了。下午去海里游泳,贼刺激,说实话海水不好喝,闭气躺在海上是真的爽,以前总是用泳圈在玩,现在感觉游泳圈不好玩了。


次短路,数据结构以前可能做过,总有点印象,总感觉自己敲过不止一遍这个。

如果当前路径比最短路短,就把最短路的值给次短路,最短路要当前值。

如果当前值比最短路长,比次短路短,给次短路更新为当前值

#include <bits/stdc++.h>using namespace std;#define ll long longtypedef pair<ll,int>p;const ll INF=1ll<<62;struct edge{    int to;    ll dis;    edge(int to,ll dis){        this -> to = to;        this -> dis = dis;    }};int N,R;int a,b;ll c;ll dis[100005];         //记录最短路径ll disc[100005];       //记录次短路径vector<edge>G[100005];void dijkstra(){    fill(dis,dis+100005,INF);    fill(disc,disc+100005,INF);    priority_queue<p,vector<p>,greater<p>>q;    dis[1]=0;    q.push(p(0,1));    while(!q.empty())    {        p P=q.top();        q.pop();        ll dd=P.first;        int v=P.second;        if(disc[v]<dd)continue;        for(int i=0;i<(int)G[v].size();i++)        {            edge &e=G[v][i];            ll d=dd+e.dis;            if(d<=dis[e.to])            {               // cout<<d<<endl;                ll tmp=d;                d=dis[e.to];                dis[e.to]=tmp;                q.push(p(dis[e.to],e.to));            }            if(disc[e.to]>=d&&dis[e.to]<=d)            {                disc[e.to]=d;                q.push(p(disc[e.to],e.to));            }        }    }    cout<<disc[N]<<endl;}int main(){    int t;    scanf("%d",&t);    while(t--){        for(int i=0;i<100005;i++)            G[i].clear();    scanf("%d%d",&N,&R);    for(int i=1;i<=R;i++){        scanf("%d%d%I64d",&a,&b,&c);        G[a].push_back(edge(b,c));        G[b].push_back(edge(a,c));    }    dijkstra();    }    return 0;}


原创粉丝点击