Advertisement
Guest User

Untitled

a guest
Aug 9th, 2015
186
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.58 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2. #include <assert.h>
  3. #include <unordered_map>
  4. using namespace std;
  5.  
  6. typedef long long ll;
  7. typedef long double ld;
  8. typedef vector < long long > vll;
  9. typedef pair < long long, long long > pll;
  10. typedef pair < int, int > pii;
  11. typedef vector < int > vii;
  12.  
  13. #define csl ios_base::sync_with_stdio(false); cin.tie(NULL)
  14. #define l(x) (((x) << 1) | 1)
  15. #define r(x) ((l(x)) + 1)
  16. #define mp make_pair
  17. #define fst first
  18. #define snd second
  19.  
  20. ll t, n, u, v, m, q, r, ql, qr, k, l, s, x, y, w, c;
  21. const int N = 1e5 + 500;
  22. const long long mod = 1e9 + 7;
  23. const long long INF = 1LL << 57LL;
  24. const bool JUDGE = false;
  25. vii adj[N];
  26. bool vis[N];
  27. vii cst[N];
  28. ll P[N];
  29. ll deepest[N];
  30. ll deep[N];
  31. ll dp[N];
  32. ll len[N];
  33. ll D[N];
  34. multiset < ll > A[N];
  35. ll ans = 0;
  36. vll cv;
  37. void dfs(int v, int p, int dep) {
  38.     D[v] = dep;
  39.     P[v] = p;
  40.     deepest[v] = 0;
  41.     vis[v] = true;
  42.     for (int i = 0; i < adj[v].size(); ++i) {
  43.         int u = adj[v][i];
  44.         if (u == p) continue;
  45.         dfs(u, v, dep + cst[v][i]);
  46.         ll x = deepest[u] + cst[v][i];
  47.         if (x > deepest[v]) swap(deepest[v], x);
  48.         if (deep[v] < x) deep[v] = x;
  49.         A[v].insert(deepest[u] + cst[v][i]);
  50.         len[u] = cst[v][i];
  51.     }
  52.     ans = max(ans, deepest[v] + deep[v]);
  53.     cv.push_back(v);
  54. }
  55. ll lm;
  56. int up(int v) {
  57.     if (P[v] == -1) {
  58.         return 0;
  59.     }
  60.     if (dp[v] != -1) return dp[v];
  61.     ll & ret  = dp[v];
  62.     ret = up(P[v]) + len[v];
  63.     A[P[v]].erase(A[P[v]].find(deepest[v] + len[v]));
  64.     if (A[P[v]].size()) ret = max(ret, *A[P[v]].rbegin() + len[v]);
  65.     A[P[v]].insert(deepest[v] + len[v]);
  66.     return ret;
  67. }
  68. vll R;
  69. int main(){
  70.     csl;
  71.     if (JUDGE) {
  72.         freopen("in.txt", "r", stdin);
  73.         freopen("out.txt", "w", stdout);
  74.     }
  75.     cin >> n >> m >> l;
  76.     memset(dp, -1, sizeof(dp));
  77.     memset(P, -1, sizeof(P));
  78.     for (int i = 0; i < m; ++i) {
  79.         cin >> u >> v >> c;
  80.         adj[u].push_back(v);
  81.         adj[v].push_back(u);
  82.         cst[u].push_back(c);
  83.         cst[v].push_back(c);
  84.     }
  85.     for (int i = 0; i < n; ++i) {
  86.         if (vis[i]) continue;
  87.         cv.clear();
  88.         lm = INF;
  89.         dfs(i, -1, 0);
  90.         for (int j = 0; j < cv.size(); ++j) {
  91.             up(cv[j]);
  92.         }
  93.         for (int j = 0; j < cv.size(); ++j) {
  94.             lm = min(lm, max(dp[cv[j]], deepest[cv[j]]));
  95.         }
  96.         R.push_back(lm);
  97.     }
  98.     sort(R.begin(), R.end());
  99.     reverse(R.begin(), R.end());
  100.     if (R.size() == 1);
  101.     //cout << ans << '\n';
  102.     /*for (int i = 0; i < R.size(); ++i) {
  103.         cout << R[i] << " ";
  104.     }cout << '\n';*/
  105.     if (R.size() >= 2) {
  106.         ans = max(ans, R[0] + R[1] + l);
  107.         //cout << ans << '\n';
  108.     }
  109.     if (R.size() >= 3) {
  110.         ans = max(ans, R[1] + R[2] + l * 2LL);
  111.         //cout << ans << '\n';
  112.     }
  113.     cout << ans << '\n';
  114.     return 0;
  115. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement