이 제출은 이전 버전의 oj.uz에서 채점하였습니다. 현재는 제출 당시와는 다른 서버에서 채점을 하기 때문에, 다시 제출하면 결과가 달라질 수도 있습니다.
#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 time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |