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 111 112 113 114 115 116 117 118 119
|
#include <bits/stdc++.h> #define FOR(i, a, b) for (int i = a; i <= b; ++i) #define ROF(i, a, b) for (int i = a; i >= b; --i) #define all(x) x.begin(),x.end() #define debug(x) cerr<<x<<'\n'
using namespace std;
typedef long long ll; typedef unsigned long long ull; typedef pair<ll,ll> pll; typedef array<ll,3> arr; typedef double DB; const ll MAXN=static_cast<ll>(2e5)+10,MAXval=static_cast<ll>(5e18)+3;
ll N,M,K; vector<pll> G[MAXN]; struct Triple{ ll u,v,w; }; struct cmp{ bool operator()(const Triple &a,const Triple &b)const{ return a.w>b.w; } }; priority_queue<Triple,vector<Triple>,cmp> pq;
struct FA{ ll fa[MAXN],size,numa[MAXN],numb[MAXN]; inline void init(ll range){ size=range; FOR(i,1,size){ fa[i]=i; numa[i]=0; numb[i]=0; } } ll find(ll x){ if(fa[x]==x) return x; return fa[x]=find(fa[x]); } inline void merge(ll a,ll b){ ll faA=find(a),faB=find(b); fa[faA]=faB; numa[faB]+=numa[faA]; numb[faB]+=numb[faA]; } inline ll match(ll a,ll b){ ll faA=find(a),faB=find(b); ll aOption=min(numa[faA],numb[faB]),bOption=min(numb[faA],numa[faB]); numa[faA]-=aOption; numb[faB]-=aOption; numb[faA]-=bOption; numa[faB]-=bOption; return aOption+bOption; } };
int main() { ios::sync_with_stdio(false); cin.tie(0);cout.tie(0); cin>>N>>M>>K; FA fa; fa.init(N); FOR(i, 1, M){ ll u,v,w; cin>>u>>v>>w; G[u].push_back({v,w}); G[v].push_back({u,w}); pq.push((Triple){u,v,w}); } FOR(i,1,K){ ll a; cin>>a; fa.numa[a]+=1; } FOR(i,1,K){ ll b; cin>>b; fa.numb[b]+=1; } ll ans=0; while(!pq.empty()){ ll u=pq.top().u,v=pq.top().v,w=pq.top().w; pq.pop(); if(fa.find(u)!=fa.find(v)){ ans+=w*fa.match(u,v); fa.merge(u,v); } } cout<<ans<<'\n'; return 0; }
|