Advertisement
Guest User

2nd Shortest Path

a guest
Jun 12th, 2015
474
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.96 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2.  
  3. typedef long long ll;
  4. using namespace std;
  5.  
  6. #define all(x) x.begin(), x.end()
  7. #define f(i,a,b) for(int i = (a); i <= (b); i++)
  8. #define fd(i,a,b) for(int i = (a); i >= (b); i--)
  9. #define mp make_pair
  10. #define faster_io() ios_base::sync_with_stdio(false)
  11. #define pb push_back
  12. #define pii pair<int,int>
  13. #define SZ(x) ((int)x.size())
  14. #define vii vector< pair<int,int> >
  15.  
  16. const int INF = 1000000007;
  17. const ll INFLL = 100000000000000000ll;
  18. const ll MOD = 1000000007;
  19.  
  20. // ----------------------------------------------------------------------------------------------------------
  21.  
  22. int D[5005][2], T, N, M;
  23. vii E[5005];
  24.  
  25. int main()
  26. {
  27.     cin >> T;
  28.  
  29.     f(tt,1,T)
  30.     {
  31.         cin >> N >> M;
  32.         f(i,1,N) E[i].clear(), D[i][0] = D[i][1] = INF;
  33.  
  34.         f(i,1,M)
  35.         {
  36.             int a, b, c;
  37.             scanf("%d %d %d", &a, &b, &c);
  38.             E[a].pb(mp(b,c)), E[b].pb(mp(a,c));
  39.         }
  40.  
  41.         priority_queue<pair<int, pii >,vector<pair<int, pii > >,greater<pair<int, pii > > > q;
  42.         D[1][0] = 0;
  43.         q.push(mp(0,mp(1,0)));
  44.  
  45.         while(!q.empty())
  46.         {
  47.             pair<int,pii> p = q.top();
  48.             q.pop();
  49.  
  50.             int n = p.second.first, j = p.second.second, d = p.first;
  51.             if(d > D[n][j]) continue;
  52.  
  53.             for(int i = 0; i < SZ(E[n]); i++)
  54.             {
  55.                 pii pr = E[n][i];
  56.                 int nd = d + pr.second;
  57.                 int v = pr.first;
  58.  
  59.                 if(nd < D[v][0])
  60.                 {
  61.                     D[v][1] = D[v][0];
  62.                     q.push(mp(D[v][1],mp(v,1)));
  63.                     D[v][0] = nd;
  64.                     q.push(mp(nd,mp(v,0)));
  65.                 }
  66.                 else if(nd > D[v][0] && nd < D[v][1])
  67.                 {
  68.                     D[v][1] = nd;
  69.                     q.push(mp(nd,mp(v,1)));
  70.                 }
  71.             }
  72.         }
  73.  
  74.         cout << "Case " << tt << ": " << D[N][1] << "\n";
  75.     }
  76. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement