#include <iostream>
#include <vector>
#include <bitset>
#include <algorithm>
#include <utility>
using namespace std;
vector<int> p(101),rnk(101,1),num(101);
int n,k;
vector<vector<int> > c(101,vector<int>(101));
vector<pair<int,pair<int,int> > > C;
bitset<101> vis;
int find(int a){
return p[a]==a?a:p[a]=find(p[a]);
}
bool same(int a,int b){
return find(a)==find(b);
}
void merge(int a,int b){
if(!same(a,b)){
if(rnk[find(a)]>rnk[find(b)]){
num[find(a)]+=num[find(b)];
p[find(b)]=find(a);
}
else {
num[find(b)]+=num[find(a)];
p[find(a)]=find(b);
}
if(rnk[find(a)]==rnk[find(b)])
rnk[find(b)]++;
}
}
int main(){
for(int i=1;i<=100;i++)
p[i]=i;
cin>>n>>k;
for(int i=0;i<k;i++){
int x;
cin>>x;
vis[x]=1;
merge(x,0);
}
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
cin>>c[i][j];
}
}
for(int i=1;i<n;i++){
for(int j=i+1;j<=n;j++){
C.push_back({c[i][j],{i,j}});
}
}
sort(C.begin(),C.end());
for(int i=0;i<C.size();i++){
if(((!vis[C[i].second.first])||(!vis[C[i].second.second]))&&(!same(C[i].second.second,C[i].second.first))){
merge(C[i].second.first,C[i].second.second);
num[find((C[i].second).first)]+=C[i].first;
if(same(C[i].second.first,0))
vis[C[i].second.first]=vis[C[i].second.second]=1;
}
}
cout<<num[find(1)]<<endl;
}
#include <vector>
#include <bitset>
#include <algorithm>
#include <utility>
using namespace std;
vector<int> p(101),rnk(101,1),num(101);
int n,k;
vector<vector<int> > c(101,vector<int>(101));
vector<pair<int,pair<int,int> > > C;
bitset<101> vis;
int find(int a){
return p[a]==a?a:p[a]=find(p[a]);
}
bool same(int a,int b){
return find(a)==find(b);
}
void merge(int a,int b){
if(!same(a,b)){
if(rnk[find(a)]>rnk[find(b)]){
num[find(a)]+=num[find(b)];
p[find(b)]=find(a);
}
else {
num[find(b)]+=num[find(a)];
p[find(a)]=find(b);
}
if(rnk[find(a)]==rnk[find(b)])
rnk[find(b)]++;
}
}
int main(){
for(int i=1;i<=100;i++)
p[i]=i;
cin>>n>>k;
for(int i=0;i<k;i++){
int x;
cin>>x;
vis[x]=1;
merge(x,0);
}
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
cin>>c[i][j];
}
}
for(int i=1;i<n;i++){
for(int j=i+1;j<=n;j++){
C.push_back({c[i][j],{i,j}});
}
}
sort(C.begin(),C.end());
for(int i=0;i<C.size();i++){
if(((!vis[C[i].second.first])||(!vis[C[i].second.second]))&&(!same(C[i].second.second,C[i].second.first))){
merge(C[i].second.first,C[i].second.second);
num[find((C[i].second).first)]+=C[i].first;
if(same(C[i].second.first,0))
vis[C[i].second.first]=vis[C[i].second.second]=1;
}
}
cout<<num[find(1)]<<endl;
}
Comments
Post a Comment