1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110
| #include <bits/stdc++.h> using namespace std; const int N=300010; #define int long long int n,m,k,sz[N],id[N],p[N],SZ[N]; struct node{int u,v,w;}q[N],qe[N],qn[N],Q[N]; struct dsu{ int f[N],sz[N]; void init(int n){ for(int i=1;i<=n;i++) f[i]=i,sz[i]=p[i]; } int getf(int x){return f[x]==x?x:f[x]=getf(f[x]);} void add(int x,int y){ x=getf(x),y=getf(y); if(x!=y)f[y]=x,sz[x]+=sz[y]; } bool in(int x,int y){return getf(x)==getf(y);} }A; const int inf=1e18; int mn[N],f[N],d[N]; bool operator<(node x,node y){return x.w<y.w;} vector<int>v[N]; void add(int x,int y){ v[x].push_back(y); v[y].push_back(x); } void Add(int x,int y){ x=id[x],y=id[y]; add(x,y); A.add(x,y); } void dfs(int x,int fa){ f[x]=fa; d[x]=d[fa]+1; for(int u:v[x]){ if(u==fa)continue; dfs(u,x); sz[x]+=sz[u]; } } void upd(int x,int y,int z){ x=id[x],y=id[y]; while(x!=y){ if(d[x]<d[y])swap(x,y); mn[x]=min(mn[x],z),x=f[x]; } } signed main(){ scanf("%lld%lld%lld",&n,&m,&k); for(int i=1;i<=m;i++)scanf("%lld%lld%lld",&q[i].u,&q[i].v,&q[i].w); for(int i=1;i<=k;i++)scanf("%lld%lld",&qe[i].u,&qe[i].v); for(int i=1;i<=n;i++)scanf("%lld",p+i); A.init(n); for(int i=1;i<=k;i++)A.add(qe[i].u,qe[i].v); sort(q+1,q+1+m); for(int i=1;i<=m;i++)qn[i]=q[i]; int tot=0; for(int i=1;i<=m;i++){ if(!A.in(q[i].u,q[i].v)){ A.add(q[i].u,q[i].v); q[++tot]=q[i]; } } int TOT=0; A.init(n); for(int i=1;i<=tot;i++)A.add(q[i].u,q[i].v); for(int i=1;i<=m;i++){ if(!A.in(qn[i].u,qn[i].v)){ A.add(qn[i].u,qn[i].v); qn[++TOT]=qn[i]; } } A.init(n); int cnt=0; for(int i=1;i<=tot;i++)A.add(q[i].u,q[i].v); for(int i=1;i<=n;i++)if(A.f[i]==i)id[i]=++cnt,SZ[cnt]=A.sz[i]; for(int i=1;i<=n;i++)id[i]=id[A.getf(i)]; int ans=0; for(int i=1;i<(1<<k);i++){ int res=0,flag=0; for(int j=1;j<=cnt;j++)sz[j]=SZ[j]; A.init(cnt); for(int j=1;j<=cnt;j++)v[j].clear(),mn[j]=inf; for(int j=1;j<=k;j++){ if((i>>j-1)&1^1)continue; if(A.in(id[qe[j].u],id[qe[j].v])){flag=1;break;} Add(qe[j].u,qe[j].v); } if(flag)continue; int idx=0; for(int j=1;j<=TOT;j++){ if(!A.in(id[qn[j].u],id[qn[j].v]))Add(qn[j].u,qn[j].v); else Q[++idx]=qn[j]; } dfs(id[1],0); for(int j=1;j<=idx;j++){ upd(Q[j].u,Q[j].v,Q[j].w); } for(int j=1;j<=k;j++){ if((i>>j-1)&1^1)continue; int x=id[qe[j].u],y=id[qe[j].v]; if(d[x]<d[y])swap(x,y); res+=mn[x]*sz[x]; } ans=max(ans,res); } printf("%lld",ans); return 0; }
|