次短路(hdu 6181)

来源:互联网 发布:c网络语言是什么意思 编辑:程序博客网 时间:2024/06/05 15:04

题意:求次短路

For testcase 1, Alice take path 1 - 3 and its length is 3, and then Bob will take path 1 - 2 - 3 and its length is 5.For testcase 2, Bob will take route 1 - 2 - 1 - 2 and its length is 3

次短路在dijkstra的时候 记录次小路径,具体看代码

#include <cstdio>#include <queue>#include <algorithm>#include <cstring>#include <vector>#include <iostream>using namespace std;#define maxn 100050#define INF (1LL<<60)typedef long long int ll;typedef pair<long long int,int> P;int T;int n , m;ll dis[maxn];ll disc[maxn];vector<P>E[maxn];void dj(){    ll mi = INF;    for(int i = 0 ; i <= n ; ++i)dis[i] = disc[i] = INF;    dis[1] = 0;//只能赋值最短路的起始点为 0 ,否则次短路无法更新到原点    priority_queue<P,vector<P>,greater<P> > Q;    Q.push(P(0,1));    while(! Q.empty())    {        ll c = Q.top().first;        int u = Q.top().second;        Q.pop();        if( disc[u] < c )continue;        for(int i = 0 ; i < E[u].size() ; ++i)        {            int v = E[u][i].first;            ll w = E[u][i].second;            ll tmp = w + c;            if( dis[v] >= tmp )            {                swap(tmp,dis[v]);//此处注意交换                Q.push(P(dis[v],v));            }            if( disc[v] > tmp && dis[v] < tmp )            {                disc[v] = tmp;                Q.push( P(tmp,v) ) ;            }        }    }   printf("%lld\n",disc[n]);}int main(){    cin >> T;    while( T-- )    {        cin >> n >> m;        for(int i = 0 ; i <= n ; ++i)E[i].clear();        for(int i = 0 ; i < m ; ++i)        {           int a,b;           ll c;            scanf("%d %d %lld",&a,&b,&c);            E[a].push_back(P(b,c));            E[b].push_back(P(a,c));        }        dj();    }}
原创粉丝点击