Guest User

Untitled

a guest
Dec 11th, 2011
250
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.70 KB | None | 0 0
  1. #include <iostream>
  2. #include <queue>
  3. #include <vector>
  4. #include <cassert>
  5. #include <cstdio>
  6.  
  7. #ifdef _DEBUG
  8. const int MN = 100;
  9. #else
  10. const int MN = 1000 * 10 + 10;
  11. #endif
  12.  
  13. using namespace std;
  14.  
  15. #define ll long long
  16.  
  17. #define pii pair <ll, int>
  18. #define mp make_pair
  19.  
  20. const ll inf = (1ll << 55);
  21.  
  22. priority_queue <pii> h;
  23.  
  24. vector <ll> g[MN], w[MN];
  25.  
  26. ll dp[4][MN];
  27. int n;
  28.  
  29. void dfs(int v, int len, ll ww, int k) {
  30.     if (!len)
  31.         dp[k][v] = min(dp[k][v], ww);
  32.     else {
  33.         for(int i = 0; i < g[v].size(); i ++) {
  34.             int to = g[v][i];
  35.             dfs(to, len - 1, ww + w[v][i], k);
  36.         }
  37.     }
  38. }
  39.  
  40. void solve(int st, int k) {
  41.     for(int i = 0; i < n; i ++)
  42.         if (dp[k][i] != inf)
  43.             h.push(mp(-dp[k][i], i));
  44.     dp[k][st] = 0;
  45.     while (!h.empty()) {
  46.         int v = h.top().second;
  47.         ll d = -h.top().first;
  48.         h.pop();
  49.         if (d > dp[k][v])
  50.             continue;
  51.         for(int i = 0; i < g[v].size(); i ++) {
  52.             int to = g[v][i];
  53.             ll nw = max(dp[k][v], dp[k - 1][v] +  w[v][i]);
  54.             assert(dp[k][v] < inf);
  55.             if (nw < dp[k][to]) {
  56.                 dp[k][to] = nw;
  57.                 h.push(mp(-nw, to));
  58.             }
  59.         }
  60.     }
  61. }
  62.  
  63. int main () {
  64.     freopen("input.txt", "r", stdin);
  65.     freopen("output.txt", "w", stdout);
  66.     fill(&dp[0][0], &dp[0][0] + 4 * MN, inf);
  67.     for(int i = 0; i < MN; i ++)
  68.         dp[0][i] = 0;
  69.     int m, a, b;
  70.     scanf("%d%d", &n, &m);
  71.     for(int i = 0; i < m; i ++) {
  72.         int x, y, z;
  73.         scanf("%d%d%d", &x, &y, &z);
  74.         x --, y --;
  75.         g[x].push_back(y);
  76.         g[y].push_back(x);
  77.         w[x].push_back(z);
  78.         w[y].push_back(z);
  79.     }
  80.     scanf("%d%d", &a, &b);
  81.     a --, b --;
  82.     dfs(a, 1, 0, 1);
  83.     ll best = dp[1][b];
  84.     dfs(a, 2, 0, 2);
  85.     //dfs(a, 3, 0, 3);
  86.     solve(a, 1);
  87.     solve(a, 2);
  88.     //solve(a, 3);
  89.     dp[2][b] = min(dp[2][b], best);
  90.     cout << dp[2][b] << endl;
  91. }
  92.  
Advertisement
Add Comment
Please, Sign In to add comment