Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #ifdef _DEBUG
- #define _GLIBCXX_DEBUG
- #endif
- #define _CRT_SECURE_NO_WARNINGS
- #include <ext/pb_ds/assoc_container.hpp>
- #include <bits/stdc++.h>
- using namespace __gnu_pbds;
- using namespace std;
- typedef long long ll;
- typedef vector<ll> vll;
- typedef pair<int, int> pii;
- typedef vector<int> vi;
- typedef long double ld;
- typedef tree<int, null_type, less<int>, rb_tree_tag, tree_order_statistics_node_update> ordered_set;
- #define mk make_pair
- #define inb push_back
- #define enb emplace_back
- #define X first
- #define Y second
- #define all(v) v.begin(), v.end()
- #define sqr(x) (x) * (x)
- #define TIME 1.0 * clock() / CLOCKS_PER_SEC
- #define y1 AYDARBOG
- //continue break pop_back return
- int solve();
- int main()
- {
- ios_base::sync_with_stdio(0);
- cin.tie(0);
- #define TASK "robots"
- #ifndef _DEBUG
- //freopen(TASK".in", "r", stdin), freopen(TASK".out", "w", stdout);
- #endif
- solve();
- //#ifdef _DEBUG
- fprintf(stderr, "\nTIME: %.3f\n", TIME);
- //#endif
- }
- const ll INF = 2e18 + 7;
- const int BUFSZ = (int)4e6 + 7;
- char buf[BUFSZ];
- string get_str()
- {
- scanf(" %s", buf);
- return string(buf);
- }
- int solve()
- {
- int n, m, k;
- cin >> n >> m >> k;
- vector<vector<pii>> g(n);
- vector<pair<int, pii>> e;
- for (int i = 0; i < m; ++i)
- {
- int x, y, c;
- cin >> x >> y >> c;
- --x, --y;
- e.inb(mk(c, mk(x, y)));
- g[x].inb(mk(y, c));
- g[y].inb(mk(x, c));
- }
- sort(all(e));
- vector<pii> ee(k);
- for (int i = 0; i < k; ++i)
- {
- cin >> ee[i].X >> ee[i].Y;
- --ee[i].X, --ee[i].Y;
- }
- vi cnt(n);
- ll sumcnt = 0;
- for (int i = 0; i < n; ++i)
- {
- cin >> cnt[i];
- sumcnt += cnt[i];
- }
- //printf("SUMCNT : %lld\n", sumcnt);
- vi p(n), r(n);
- ll ans = 0;
- for (int msk = 0; msk < (1 << k); ++msk)
- {
- if (msk == 0)
- continue;
- int sz = __builtin_popcount(msk);
- vector<pii> ce;
- for (int i = 0; i < k; ++i)
- {
- if ((msk >> i) & 1)
- {
- ce.inb(ee[i]);
- }
- }
- for (int I = 0; I < sz; ++I)
- {
- g.clear();
- g.resize(n);
- for (int i = 0; i < n; ++i)
- {
- p[i] = i;
- r[i] = 0;
- }
- function<int(int)> get = [&](int u)
- {
- if (p[u] == u)
- return u;
- return p[u] = get(p[u]);
- };
- vector<pair<int, pii>> eo;
- for (int i = 0; i < sz; ++i)
- {
- if (i != I)
- {
- int x = get(ce[i].X);
- int y = get(ce[i].Y);
- if (x != y)
- {
- if (r[x] < r[y])
- swap(r[x], r[y]);
- p[y] = x;
- if (r[x] == r[y])
- ++r[x];
- g[ce[i].X].inb(mk(ce[i].Y, 0));
- g[ce[i].Y].inb(mk(ce[i].X, 0));
- eo.inb(mk(0, ce[i]));
- }
- }
- }
- for (int i = 0; i < m; ++i)
- {
- int x = get(e[i].Y.X);
- int y = get(e[i].Y.Y);
- if (x != y)
- {
- if (r[x] < r[y])
- swap(r[x], r[y]);
- p[y] = x;
- if (r[x] == r[y])
- ++r[x];
- g[e[i].Y.X].inb(mk(e[i].Y.Y, e[i].X));
- g[e[i].Y.Y].inb(mk(e[i].Y.X, e[i].X));
- //printf("COST :: %d BTW :: %d %d\n", e[i].X, e[i].Y.X + 1, e[i].Y.Y + 1);
- eo.inb(e[i]);
- }
- }
- //printf("%d\n", (int)eo.size());
- //postroili s pacanami ostov
- pii cure = ce[I];
- vi rx(n), ry(n);
- function<void(int, int, vi&)> dfsr = [&](int u, int pr, vi &rr)
- {
- for (pii tt : g[u])
- {
- int to = tt.X;
- if (to == pr)
- continue;
- rr[to] = rr[u] + 1;
- dfsr(to, u, rr);
- }
- };
- dfsr(ce[I].X, -1, rx);
- dfsr(ce[I].Y, -1, ry);
- int mxcst = 0;
- for (int i = 0; i < (int)eo.size(); ++i)
- {
- int cdstx = rx[eo[i].Y.X] + ry[eo[i].Y.X];
- int cdsty = rx[eo[i].Y.Y] + ry[eo[i].Y.Y];
- //printf("COST :: %d CDST :: %d\n", eo[i].X, cdst);
- if (rx[cure.Y] == cdstx && cdstx == cdsty)
- {
- mxcst = max(mxcst, eo[i].X);
- }
- }
- if (mxcst == 0)
- continue;
- ll curcnt = 0;
- function<void(int, int)> dfscnt = [&](int u, int pr)
- {
- curcnt += cnt[u];
- for (pii tt : g[u])
- {
- int to = tt.X;
- int cc = tt.Y;
- if (to == pr || cc == mxcst)
- continue;
- dfscnt(to, u);
- }
- };
- dfscnt(0, 0);
- ans = max(ans, 1ll * (sumcnt - curcnt) * mxcst);
- }
- }
- printf("%lld\n", ans);
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement