HDU6181 Two Paths【次短路】

来源:互联网 发布:怎样金融网络投资 编辑:程序博客网 时间:2024/05/29 18:15

题意:求1到n的次短路


思路:套下模板


#include<stdio.h>#include<iostream>#include<string.h>#include<string>#include<stdlib.h>#include<math.h>#include<vector>#include<list>#include<map>#include<stack>#include<queue>#include<algorithm>#include<numeric>#include<functional>using namespace std;typedef long long ll;typedef pair<ll,int> pii;const int maxn = 100005;     struct edge{      int to, cost;  };vector<edge> G[maxn];ll dis[maxn];     //最短距离  ll dis2[maxn];    //次短距离  void init(int x){for(int i = 0; i <= x; i++)G[i].clear(); }void add(int a,int b,int c){G[a].push_back((edge){b,c});G[b].push_back((edge){a,c});}void solve(){      memset(dis,0x3f,sizeof dis);    memset(dis2,0x3f,sizeof dis2);      //pair是以first为主关键字进行排序      priority_queue<pii, vector<pii>, greater<pii> > q;    dis[1] = 0;      q.push(pii(0, 1));    while(!q.empty()){          pii x = q.top(); q.pop();          int v = x.second;ll d = x.first;          if(dis2[v] < d) continue;         for(int i = 0; i < G[v].size(); i++){              edge &e = G[v][i];              ll d2 = d + e.cost;              if(dis[e.to] > d2){                  swap(dis[e.to], d2);                  q.push(pii(dis[e.to], e.to));             }              if(dis2[e.to] > d2 && dis[v] < d2){                 dis2[e.to] = d2;                  q.push(pii(dis2[e.to], e.to));             }        }    }}      int main(){      int T,n,m;scanf("%d",&T);while(T--){scanf("%d%d",&n,&m);init(n);for(int i = 0; i < m; i++){int a,b,c;        scanf("%d%d%d",&a,&b,&c);          add(a,b,c);    }solve();printf("%lld\n",dis2[n]);}    return 0; }


原创粉丝点击