This submission is migrated from previous version of oj.uz, which used different machine for grading. This submission may have different result if resubmitted.
#pragma GCC optimize("Ofast,unroll-loops,inline")
#pragma GCC target("avx,avx2,fma,popcnt")
#include<bits/stdc++.h>
#define ll long long
#define ld long double
#define pb push_back
#define endl '\n'
#define all(x) x.begin(),x.end()
#define pll pair<ll,ll>
#define open(name) if(fopen(name".inp", "r")){freopen(name".inp", "r", stdin); freopen(name".out", "w", stdout);}
#define bit(x,i) (x>>i&1)
using namespace std;
const int maxN=3e5+69;
const int mod=1e9+7;
const int base=311;
ll n,m,k,a[maxN],lab[maxN],sum[44],id[maxN],weight[44],s,val[44],edge[44],par[44],d[44];
ll fset(ll x){return lab[x]<0?x:lab[x]=fset(lab[x]);}
bool uset(ll x,ll y){
if((x=fset(x))!=(y=fset(y))){
if(lab[x]>lab[y])swap(x,y);
lab[x]+=lab[y];
lab[y]=x;
return 1;
}
return 0;
}
struct edg{
ll u,v,w,id;
bool operator<(const edg&o){return w<o.w;}
};
vector<edg> cho,dit,dai,cac,lon;
vector<pll> adj[maxN];
void pre(ll u,ll p=1){
par[u]=p;
for(auto x:adj[u])if(x.first!=p){
ll v=x.first,w=weight[x.second];
edge[v]=x.second;
d[v]=d[u]+1;
pre(v,u);
}
}
void dfs(ll u,ll p=1){
val[u]=sum[u];
for(auto x:adj[u])if(x.first!=p){
ll v=x.first,w=weight[x.second];
dfs(v,u);
val[u]+=val[v];
s+=w*val[v];
}
}
void cut(ll u,ll v,ll w){
while(u!=v){
if(d[u]<d[v])swap(u,v);
weight[edge[u]]=min(weight[edge[u]],w);
u=par[u];
}
}
ll vis[maxN];
bool mst[maxN];
void Enter(){
cin>>n>>m>>k;
for(int i=1;i<=m;i++){
ll u,v,w;cin>>u>>v>>w;
cho.pb({u,v,w,i});
}
for(int i=1;i<=k;i++){
ll u,v;cin>>u>>v;
dit.pb({u,v,-1,i});
}
for(int i=1;i<=n;i++)cin>>a[i];
sort(all(cho));
memset(lab,-1,sizeof lab);
for(auto&x:cho)if(uset(x.u,x.v))mst[x.id]=1;
memset(lab,-1,sizeof lab);
for(auto&y:dit)uset(y.u,y.v);
for(auto&x:cho)
if(uset(x.u,x.v))dai.pb(x);
else if(mst[x.id])lon.pb(x);
memset(lab,-1,sizeof lab);
for(auto&x:dai)uset(x.u,x.v);
ll cnt=0;
for(int i=1;i<=n;i++){
if(!vis[fset(i)])vis[fset(i)]=++cnt;
id[i]=vis[fset(i)];
sum[id[i]]+=a[i];
}
for(auto&x:dit)x.u=id[x.u],x.v=id[x.v];
for(auto&x:cho)x.u=id[x.u],x.v=id[x.v];
for(auto&x:lon)x.u=id[x.u],x.v=id[x.v];
memset(lab,-1,44*sizeof(ll));
for(auto&x:cho)if(uset(x.u,x.v))cac.pb(x);
ll r=0;
for(int mask=1;mask<(1<<k);mask++){
memset(lab,-1,44*sizeof(ll));
memset(weight,1,sizeof weight);
weight[0]=0;
s=0;
for(int i=1;i<=40;i++)adj[i].clear(),val[i]=0;
for(int i=0;i<k;i++)if(mask>>i&1)if(uset(dit[i].u,dit[i].v))adj[dit[i].u].pb({dit[i].v,i+1}),adj[dit[i].v].pb({dit[i].u,i+1});
vector<edg> xeo;
for(auto&x:lon)
if(uset(x.u,x.v))adj[x.u].pb({x.v,0}),adj[x.v].pb({x.u,0});
else xeo.pb(x);
pre(id[1]);
for(auto&x:xeo)cut(x.u,x.v,x.w);
dfs(id[1]);
r=max(r,s);
}
cout<<r;
}
//amogus
signed main(){
//open("MSEQ");
cin.tie(nullptr);ios_base::sync_with_stdio(NULL);
//ll t=1;cin>>t;while(t--)
Enter();
}
Compilation message (stderr)
toll.cpp: In function 'void pre(long long int, long long int)':
toll.cpp:36:22: warning: unused variable 'w' [-Wunused-variable]
36 | ll v=x.first,w=weight[x.second];
| ^
# | 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... |