제출 #107231

#제출 시각아이디문제언어결과실행 시간메모리
107231brcodeCities (BOI16_cities)C++14
0 / 100
622 ms21796 KiB
#include <iostream> #include <algorithm> #include <vector> #include <map> #include <queue> #include <set> using namespace std; const int MAXN =1e5+5; int fathers[MAXN]; map<pair<int,int>,int> m1; vector<int> v1[MAXN]; int found[MAXN]; set<int> s1; int ans; vector<pair<int,pair<int,int>>> edges; vector<int> leaves; int anc(int x){ if(fathers[x]==x){ return x; } return fathers[x] = anc(fathers[x]); } void unite(int a, int b){ int x = anc(a); int y = anc(b); fathers[x] = y; } void dfs(int curr,int par){ bool ok = false; for(int x:v1[curr]){ if(x!=par){ dfs(x,curr); ok = true; } } if(!ok){ leaves.push_back(curr); } } int main() { int n,m,k; cin>>n>>k>>m; for(int i=0;i<k;i++){ int x; cin>>x; s1.insert(x); } for(int i=0;i<m;i++){ int x,y,w; cin>>x>>y>>w; edges.push_back(make_pair(w,make_pair(x,y))); m1[make_pair(x,y)] = w; } sort(edges.begin(),edges.end()); for(int i=1;i<=n;i++){ fathers[i] = i; } for(auto x:edges){ int w = x.first; int u = x.second.first; int v = x.second.second; //cout<<w<<endl; if(anc(u) == anc(v)){ continue; } ans+=w; unite(u,v); v1[u].push_back(v); v1[v].push_back(u); } dfs(1,1); queue<int> q1; for(int x:leaves){ q1.push(x); } while(!q1.empty()){ int curr =q1.front(); q1.pop(); if(s1.find(curr) == s1.end()){ continue; } for(int x:v1[curr]){ ans-= m1[make_pair(curr,x)]; q1.push(x); } } cout<<ans<<endl; }
#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...