#include <iostream>
#include <vector>
#include <algorithm>
#include <cstdint>
#include <functional>
#include <unordered_map>
#define int long long
using namespace std;
const int NMAX=1e5, MMAX=3e5, KMAX=20;
int ord[MMAX+5], u[MMAX+5], v[MMAX+5], w[MMAX+5], n, m, k, x[MMAX+5], y[MMAX+5], people[NMAX+5], used[MMAX+5], label[MMAX+5], total[MMAX+5], dp[MMAX+5], dp2[MMAX+5];
class DSU
{
public:
int sz;
vector <int> t;
DSU (int n=0): sz (n), t (n+1, -1) {};
void reset (int n)
{
sz=n;
t.resize (n+1);
for (int i=0;i<=n;i++)
{
t[i]=-1;
}
}
int get (int nod) {return t[nod]<0?nod:t[nod]=get (t[nod]);}
bool same (int nod, int nod1) {return get (nod)==get (nod1);}
void join (int x, int y)
{
x=get (x), y=get (y);
if (x==y)
return;
t[y]=x;
}
};
int32_t main ()
{
ios :: sync_with_stdio (0);
cin.tie (nullptr);
cin >> n >> m >> k;
for (int i=0;i<m;i++)
{
cin >> u[i] >> v[i] >> w[i];
ord[i]=i;
}
for (int i=0;i<k;i++)
{
cin >> x[i] >> y[i];
}
for (int i=1;i<=n;i++)
{
cin >> people[i];
}
sort (ord, ord+m, [] (int a, int b) {return w[a]<w[b];});
DSU dsu (n);
for (int i=0;i<k;i++)
{
if (!dsu.same (x[i], y[i])) dsu.join (x[i], y[i]);
}
for (int i=0;i<m;i++)
{
if (!dsu.same (u[ord[i]], v[ord[i]])) dsu.join (u[ord[i]], v[ord[i]]), used[ord[i]]=1;
}
dsu.reset (n);
for (int i=0;i<m;i++)
{
if (used[ord[i]]) dsu.join (u[ord[i]], v[ord[i]]);
}
unordered_map <int, int> component;
int c=0;
for (int i=1;i<=n;i++)
{
int current=dsu.get (i);
if (component.find(current)==component.end()) component[current]=++c;
label[i]=component[current];
total[label[i]]+=people[i];
}
for (int i=0;i<m;i++)
{
u[ord[i]]=label[u[ord[i]]];
v[ord[i]]=label[v[ord[i]]];
}
for (int i=0;i<k;i++)
{
x[i]=label[x[i]];
y[i]=label[y[i]];
}
vector <int> undid;
dsu.reset (c);
for (int i=0;i<m;i++)
{
if (!dsu.same (u[ord[i]], v[ord[i]])) dsu.join (u[ord[i]], v[ord[i]]), undid.push_back (ord[i]);
}
vector <vector <int>> vec (c+1);
vector <int> parent (c+1), ub (c+1), depth (c+1), added ((int) undid.size());
function<void(int, int)> dfs = [&] (int nod, int p=0)
{
parent[nod]=p;
dp[nod]=total[nod];
for (auto adj : vec[nod])
{
if (adj==p)
continue;
depth[adj]=depth[nod]+1;
dfs (adj, nod);
dp[nod]+=dp[adj];
}
};
int mx=-1;
for (int msk=0;msk<(1 << k);msk++)
{
for (int i=0;i<=c;i++)
{
vec[i].clear ();
dp2[i]=1e9;
depth[i]=0;
}
dsu.reset (c);
int cycle=0;
for (int i=0;i<k;i++)
{
if ((msk >> i) & 1)
{
if (dsu.same (x[i], y[i]))
{
cycle=1;
break;
}
dsu.join (x[i], y[i]);
vec[x[i]].push_back (y[i]);
vec[y[i]].push_back (x[i]);
}
}
if (cycle)
continue;
for (int i=0;i<undid.size();i++)
{
int crtord=undid[i];
used[i]=!dsu.same (u[crtord], v[crtord]);
if (!dsu.same (u[crtord], v[crtord]))
{
dsu.join (u[crtord], v[crtord]);
vec[u[crtord]].push_back (v[crtord]);
vec[v[crtord]].push_back (u[crtord]);
}
}
dfs (1ll, 0);
for (int i=0;i<undid.size();i++)
{
if (!used[i])
{
int crtord=undid[i];
int x=u[crtord], y=v[crtord], val=w[crtord];
if (depth[x]<depth[y])
swap (x, y);
for (;depth[x]>depth[y];x=parent[x]) dp2[x]=min (dp2[x], val);
for (;x!=y;x=parent [x], y=parent[y]) dp2[x]=min (dp2[x], val), dp2[y]=min (dp2[y], val);
}
}
int cur=0;
for (int i=0;i<k;i++)
{
if (msk & (1 << i))
{
int n=x[i], n1=y[i];
if (n==parent[n1])
{
swap (n, n1);
}
cur+=dp[n]*dp2[n];
}
}
mx=max (mx, cur);
}
cout << mx;
return 0;
}
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |