rt,我对拍了几千个点,和标程只错了一个点,但太大了不好观察,小数据就没错过,wa 55pts,wa on 5,6,14-20。
#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;
const int N=2e5+5,M=N*3+20,inf=0x3f3f3f3f; typedef long long ll;
int n,m,k,tot,cnt,head[N],mn[N],fa[N],p[N],sum[N],Sum[N],a[N],b[N],f[N],g[N],dep[N],clr[N],tmn[N]; ll ans;
struct Edge{ int from,to,next,val,typ; }e[M<<1],e1[M<<1]; vector<int>E;
void add_edge(int u,int v,int w,int typ){ e[++cnt]={u,v,head[u],w,typ},head[u]=cnt; }
void add(int u,int v,int w){ e1[++cnt]={u,v,head[u],w},head[u]=cnt; }
int cmp(Edge x,Edge y){ return x.val==y.val?x.from>y.from:x.val<y.val; }
int find(int x){ return x==fa[x]?x:fa[x]=find(fa[x]); }
void uni(int x,int y){ if(find(y)<find(x)) swap(x,y); fa[find(y)]=find(x); }
void dfs(int u,int fa){ Sum[u]=sum[u];
for(int i=head[u];i;i=e1[i].next){
int v=e1[i].to,w=e1[i].val;
if(v==fa) continue; dep[v]=dep[u]+1,
f[v]=u,dfs(v,u),Sum[u]+=Sum[v];
}
}
void upd(int u,int v,int w){ for(;u^v;u=f[u]){ if(dep[u]<dep[v]) swap(u,v); mn[u]=min(mn[u],w); } }
int main(){
scanf("%d%d%d",&n,&m,&k);
for(int i=1;i<=m;i++){ int u,v,w;
scanf("%d%d%d",&u,&v,&w);
add_edge(u,v,w,0);
}
for(int i=1;i<=k;i++)
scanf("%d%d",a+i,b+i),
add_edge(a[i],b[i],0,1);
for(int i=1;i<=n;i++)
scanf("%d",p+i),fa[i]=i;
sort(e+1,e+1+m+k,cmp); int num=0;
for(int i=1;i<=m+k;i++){
int u=e[i].from,v=e[i].to,w=e[i].val; if(num==n-1) break;
if(find(u)^find(v)) uni(u,v),num++,e[i].typ?void():E.push_back(i);
} cnt=0; for(int i=1;i<=n;i++) fa[i]=i; for(auto i:E) uni(e[i].from,e[i].to);
for(int i=1;i<=n;i++) if(fa[i]==i) sum[clr[i]=++tot]=p[i]; else sum[clr[i]=clr[find(i)]]+=p[i];
for(int i=1;i<=m+k;i++) e[i].from=clr[e[i].from],e[i].to=clr[e[i].to]; for(int i=1;i<=k;i++) a[i]=clr[a[i]],b[i]=clr[b[i]];
E.clear();for(int i=1;i<=n;i++) fa[i]=i; num=0;
for(int i=1;i<=m+k;i++){
if(e[i].typ) continue;
int u=e[i].from,v=e[i].to,w=e[i].val; if(num==n-1) break;
if(find(u)^find(v)) uni(u,v),num++,e[i].typ?void():E.push_back(i);
}
for(int S=1;S<(1<<k);S++){ cnt=0;
for(int i=0;i<=tot;i++) fa[i]=i,head[i]=0,mn[i]=inf,dep[i]=f[i]=0,Sum[i]=sum[i];
int chk=0; for(int i=1;i<=k;i++)
if(S>>(i-1)&1){
if(find(a[i])==find(b[i])){ chk=1; break;}
uni(a[i],b[i]),add(a[i],b[i],0),add(b[i],a[i],0);
}
if(chk) continue;
for(auto i:E){
int u=e[i].from,v=e[i].to; if(find(u)==find(v)) continue;
uni(u,v),add(u,v,e[i].val),add(v,u,e[i].val);
} dfs(clr[1],0); ll res=0;
for(auto i:E) upd(e[i].from,e[i].to,e[i].val);
for(int i=1;i<=k;i++)
if(S>>(i-1)&1){
if(dep[a[i]]<dep[b[i]])
swap(a[i],b[i]);
res+=1ll*mn[a[i]]*Sum[a[i]];
}
ans=max(ans,res);
} return printf("%lld",ans),0;
}