Submission #881080

#TimeUsernameProblemLanguageResultExecution timeMemory
881080irmuunCities (BOI16_cities)C++17
0 / 100
491 ms50572 KiB
#include<bits/stdc++.h> using namespace std; #define ll long long #define pb push_back #define ff first #define ss second #define all(s) s.begin(),s.end() #define rall(s) s.rbegin(),s.rend() struct dsu{ ll n; vector<ll>p,sz; dsu(ll n):n(n){ p.resize(n+1); iota(all(p),0); sz.resize(n+1); fill(all(sz),1); } ll find(ll x){ if(p[x]==x) return p[x]; return p[x]=find(p[x]); } void merge(ll a,ll b){ a=find(a); b=find(b); if(a!=b){ if(sz[a]<sz[b]) swap(a,b); sz[a]+=sz[b]; p[b]=a; } } bool same(ll a,ll b){ a=find(a); b=find(b); return a==b; } }; int main(){ ios_base::sync_with_stdio(false); cin.tie(0); cout.tie(0); ll n,k,m; cin>>n>>k>>m; vector<bool>need(n+1,0); for(ll i=1;i<=k;i++){ ll imp; cin>>imp; need[imp]=true; } set<ll>adj[n+1]; vector<array<ll,3>>road(m); map<pair<ll,ll>,ll>mp; for(ll i=0;i<m;i++){ ll a,b,c; cin>>a>>b>>c; mp[{a,b}]=c; mp[{b,a}]=c; road[i]={c,a,b}; } sort(all(road)); dsu ds(n); ll ans=0; for(ll i=0;i<m;i++){ auto [c,a,b]=road[i]; if(ds.same(a,b)==false){ adj[a].insert(b); adj[b].insert(a); ans+=c; ds.merge(a,b); } } queue<ll>q; for(ll i=1;i<=n;i++){ if(adj[i].size()==1){ q.push(i); } } while(!q.empty()){ ll x=q.front(); q.pop(); if(need[x]==true){ continue; } auto y=*adj[x].begin(); ans-=mp[{x,y}]; adj[x].erase(y); adj[y].erase(x); if(adj[y].size()==1){ q.push(y); } } cout<<ans; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...