#include<bits/stdc++.h>
using namespace std;
#define ll long long
const ll N = 5e5 + 5;
const ll mod = 1e9 + 7;
const ll inf = LLONG_MAX/5;
#define bit(x,y) ((x >> y) & 1)
typedef struct
{
ll u,v,w;
}burh;
ll cmp(burh x,burh y)
{
return x.w < y.w;
}
burh p[N];
burh kp[N];
bool seen[N];
ll par[N],w[N],mst[N],np[N],nw[1005],limit[1005],sw[1005],parr[1005];
burh sus[1005];
vector<pair<ll,ll>> a[N];
vector<ll> b[N];
vector<ll> g[N];
ll n,m,n2,m2,k;
ll h[N];
void build(ll x, ll px)
{
sw[x] = nw[x];
for(auto y : g[x])
{
if(y == px) continue;
parr[y] = x;
h[y] = h[x] + 1;
build(y,x);
sw[x] += sw[y];
}
}
void setlimit(ll x, ll y, ll z)
{
if(h[x] < h[y]) swap(x,y);
while(h[x] > h[y])
{
limit[x] = min(limit[x],z);
x = parr[x];
}
while(x != y)
{
limit[x] = min(limit[x],z);
limit[y] = min(limit[y],z);
x = parr[x];
y = parr[y];
}
}
ll fp(ll x)
{
if(par[x] == 0) return x;
else
{
par[x] = fp(par[x]);
return par[x];
}
}
void hop(ll x, ll y)
{
ll px = fp(x);
ll py = fp(y);
if(px == py) return;
par[px] = py;
}
int main()
{
ios_base::sync_with_stdio(false);
cin.tie(0);
cin >> n >> m >> k;
ll i,j;
for(i = 1;i <= m;i++)
{
cin >> p[i].u >> p[i].v >> p[i].w;
a[p[i].u].push_back({p[i].v,i});
a[p[i].v].push_back({p[i].u,i});
}
for(i = 1;i <= k;i++)
{
cin >> kp[i].u >> kp[i].v;
b[kp[i].u].push_back(kp[i].v);
b[kp[i].v].push_back(kp[i].u);
}
for(i = 1;i <= n;i++) cin >> w[i];
priority_queue<pair<ll,pair<ll,ll>>,vector<pair<ll,pair<ll,ll>>>,greater<pair<ll,pair<ll,ll>>>> pq;
pq.push({0,{1,0}});
while(!pq.empty())
{
ll x = pq.top().second.first;
ll ip = pq.top().second.second;
pq.pop();
if(seen[x] == 1) continue;
seen[x] = 1;
mst[ip] = 1;
for(auto tmp : a[x])
{
ll y = tmp.first;
ll id = tmp.second;
ll dis = p[id].w;
if(seen[y] == 1) continue;
pq.push({dis,{y,id}});
}
}
for(i = 1;i <= n;i++) seen[i] = 0;
pq.push({0,{1,0}});
while(!pq.empty())
{
ll x = pq.top().second.first;
ll ip = pq.top().second.second;
pq.pop();
if(seen[x] == 1) continue;
seen[x] = 1;
mst[ip]++;
for(auto tmp : a[x])
{
ll y = tmp.first;
ll id = tmp.second;
ll dis = p[id].w;
if(seen[y] == 1) continue;
pq.push({dis,{y,id}});
}
for(auto y : b[x])
{
if(seen[y] == 1) continue;
pq.push({0,{y,0}});
}
}
for(i = 1;i <= m;i++)
{
if(mst[i] == 2)
{
hop(p[i].u,p[i].v);
}
}
for(i = 1;i <= n;i++)
{
if(np[fp(i)] == 0)
{
np[fp(i)] = ++n2;
}
np[i] = np[fp(i)];
nw[np[i]] += w[i];
}
for(i = 1;i <= n;i++) par[i] = 0;
for(i = 1;i <= k;i++)
{
kp[i].u = np[kp[i].u];
kp[i].v = np[kp[i].v];
}
for(i = 1;i <= m;i++)
{
if(mst[i] == 1)
{
if(np[p[i].u] != np[p[i].v])
{
sus[++m2] = {np[p[i].u],np[p[i].v],p[i].w};
}
}
}
sort(sus + 1,sus + 1 + m2,cmp);
ll tans = 0;
for(i = 0;i < (1 << k);i++)
{
for(j = 1;j <= n2;j++)
{
par[j] = 0;
g[j].clear();
}
ll flag = 0;
for(j = 1;j <= k;j++)
{
if(bit(i,j - 1))
{
if(fp(kp[j].u) == fp(kp[j].v))
{
flag = 1;
break;
}else
{
hop(kp[j].u,kp[j].v);
g[kp[j].u].push_back(kp[j].v);
g[kp[j].v].push_back(kp[j].u);
}
}
}
if(flag == 1) continue;
for(j = 1;j <= m2;j++)
{
if(fp(sus[j].u) != fp(sus[j].v))
{
hop(sus[j].u,sus[j].v);
g[sus[j].u].push_back(sus[j].v);
g[sus[j].v].push_back(sus[j].u);
}
}
h[1] = 1;
build(1,0);
for(j = 1;j <= n2;j++)
{
limit[j] = inf;
}
for(j = 1;j <= m2;j++)
{
setlimit(sus[j].u,sus[j].v,sus[j].w);
}
ll ans = 0;
for(j = 1;j <= k;j++)
{
if(bit(i,j - 1))
{
if(h[kp[j].u] < h[kp[j].v]) swap(kp[j].u,kp[j].v);
ll x = kp[j].u;
ans += limit[x] * sw[x];
}
}
tans = max(tans,ans);
}
cout << tans;
}
# | 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... |