Advertisement
K_Y_M_bl_C

Untitled

Mar 17th, 2018
89
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.91 KB | None | 0 0
  1. #ifdef _DEBUG
  2. #define _GLIBCXX_DEBUG
  3. #endif
  4. #define _CRT_SECURE_NO_WARNINGS
  5. #include <ext/pb_ds/assoc_container.hpp>
  6. #include <bits/stdc++.h>
  7.          
  8. using namespace __gnu_pbds;
  9. using namespace std;
  10.            
  11. typedef long long ll;
  12. typedef vector<ll> vll;
  13. typedef pair<int, int> pii;
  14. typedef vector<int> vi;
  15. typedef long double ld;
  16. typedef tree<int, null_type, less<int>, rb_tree_tag, tree_order_statistics_node_update> ordered_set;
  17.            
  18. #define mk make_pair
  19. #define inb push_back
  20. #define enb emplace_back
  21. #define X first
  22. #define Y second
  23. #define all(v) v.begin(), v.end()
  24. #define sqr(x) (x) * (x)
  25. #define TIME 1.0 * clock() / CLOCKS_PER_SEC
  26. #define y1 AYDARBOG
  27. //continue break pop_back return
  28.            
  29. int solve();
  30.            
  31. int main()
  32. {
  33.     ios_base::sync_with_stdio(0);
  34.     cin.tie(0);
  35. #define TASK "robots"
  36. #ifndef _DEBUG
  37.     //freopen(TASK".in", "r", stdin), freopen(TASK".out", "w", stdout);
  38. #endif
  39.     solve();
  40. //#ifdef _DEBUG
  41.     fprintf(stderr, "\nTIME: %.3f\n", TIME);
  42. //#endif
  43. }
  44.    
  45. const ll INF = 2e18 + 7;
  46.    
  47. const int BUFSZ = (int)4e6 + 7;
  48. char buf[BUFSZ];
  49. string get_str()
  50. {
  51.     scanf(" %s", buf);
  52.     return string(buf);
  53. }
  54.  
  55. int solve()
  56. {
  57.     int n, m, k;
  58.     cin >> n >> m >> k;
  59.     vector<vector<pii>> g(n);
  60.     vector<pair<int, pii>> e;
  61.     for (int i = 0; i < m; ++i)
  62.     {
  63.         int x, y, c;
  64.         cin >> x >> y >> c;
  65.         --x, --y;
  66.         e.inb(mk(c, mk(x, y)));
  67.         g[x].inb(mk(y, c));
  68.         g[y].inb(mk(x, c));
  69.     }
  70.     sort(all(e));
  71.     vector<pii> ee(k);
  72.     for (int i = 0; i < k; ++i)
  73.     {
  74.         cin >> ee[i].X >> ee[i].Y;
  75.         --ee[i].X, --ee[i].Y;
  76.     }
  77.     vi cnt(n);
  78.     ll sumcnt = 0;
  79.     for (int i = 0; i < n; ++i)
  80.     {
  81.         cin >> cnt[i];
  82.         sumcnt += cnt[i];
  83.     }
  84.     //printf("SUMCNT : %lld\n", sumcnt);
  85.     vi p(n), r(n);
  86.     ll ans = 0;
  87.     for (int msk = 0; msk < (1 << k); ++msk)
  88.     {
  89.         if (msk == 0)
  90.             continue;
  91.         int sz = __builtin_popcount(msk);
  92.         vector<pii> ce;
  93.         for (int i = 0; i < k; ++i)
  94.         {
  95.             if ((msk >> i) & 1)
  96.             {
  97.                 ce.inb(ee[i]);
  98.             }
  99.         }
  100.         for (int I = 0; I < sz; ++I)
  101.         {
  102.             g.clear();
  103.             g.resize(n);
  104.             for (int i = 0; i < n; ++i)
  105.             {
  106.                 p[i] = i;
  107.                 r[i] = 0;
  108.             }
  109.             function<int(int)> get = [&](int u)
  110.             {
  111.                 if (p[u] == u)
  112.                     return u;
  113.                 return p[u] = get(p[u]);
  114.             };
  115.             vector<pair<int, pii>> eo;
  116.             for (int i = 0; i < sz; ++i)
  117.             {
  118.                 if (i != I)
  119.                 {
  120.                     int x = get(ce[i].X);
  121.                     int y = get(ce[i].Y);
  122.                     if (x != y)
  123.                     {
  124.                         if (r[x] < r[y])
  125.                             swap(r[x], r[y]);
  126.                         p[y] = x;
  127.                         if (r[x] == r[y])
  128.                             ++r[x];
  129.                         g[ce[i].X].inb(mk(ce[i].Y, 0));
  130.                         g[ce[i].Y].inb(mk(ce[i].X, 0));
  131.                         eo.inb(mk(0, ce[i]));
  132.                     }
  133.                 }
  134.             }
  135.             for (int i = 0; i < m; ++i)
  136.             {
  137.                 int x = get(e[i].Y.X);
  138.                 int y = get(e[i].Y.Y);
  139.                 if (x != y)
  140.                 {
  141.                     if (r[x] < r[y])
  142.                         swap(r[x], r[y]);
  143.                     p[y] = x;
  144.                     if (r[x] == r[y])
  145.                         ++r[x];
  146.                     g[e[i].Y.X].inb(mk(e[i].Y.Y, e[i].X));
  147.                     g[e[i].Y.Y].inb(mk(e[i].Y.X, e[i].X));
  148.                     //printf("COST :: %d  BTW :: %d %d\n", e[i].X, e[i].Y.X + 1, e[i].Y.Y + 1);
  149.                     eo.inb(e[i]);
  150.                 }
  151.             }
  152.             //printf("%d\n", (int)eo.size());
  153.             //postroili s pacanami ostov
  154.             pii cure = ce[I];
  155.             vi rx(n), ry(n);
  156.             function<void(int, int, vi&)> dfsr = [&](int u, int pr, vi &rr)
  157.             {
  158.                 for (pii tt : g[u])
  159.                 {
  160.                     int to = tt.X;
  161.                     if (to == pr)
  162.                         continue;
  163.                     rr[to] = rr[u] + 1;
  164.                     dfsr(to, u, rr);
  165.                 }
  166.             };
  167.             dfsr(ce[I].X, -1, rx);
  168.             dfsr(ce[I].Y, -1, ry);
  169.             int mxcst = 0;
  170.             for (int i = 0; i < (int)eo.size(); ++i)
  171.             {
  172.                 int cdstx = rx[eo[i].Y.X] + ry[eo[i].Y.X];
  173.                 int cdsty = rx[eo[i].Y.Y] + ry[eo[i].Y.Y];
  174.                 //printf("COST :: %d CDST :: %d\n", eo[i].X, cdst);
  175.                 if (rx[cure.Y] == cdstx && cdstx == cdsty)
  176.                 {
  177.                     mxcst = max(mxcst, eo[i].X);
  178.                 }
  179.             }
  180.             if (mxcst == 0)
  181.                 continue;
  182.             ll curcnt = 0;
  183.             function<void(int, int)> dfscnt = [&](int u, int pr)
  184.             {
  185.                 curcnt += cnt[u];
  186.                 for (pii tt : g[u])
  187.                 {
  188.                     int to = tt.X;
  189.                     int cc = tt.Y;
  190.                     if (to == pr || cc == mxcst)
  191.                         continue;
  192.                     dfscnt(to, u);
  193.                 }
  194.             };
  195.             dfscnt(0, 0);
  196.             ans = max(ans, 1ll * (sumcnt - curcnt) * mxcst);
  197.         }
  198.     }
  199.     printf("%lld\n", ans);
  200.     return 0;
  201. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement