比赛 |
NOIP2023模拟赛3 |
评测结果 |
C |
题目名称 |
旅游网络 |
最终得分 |
0 |
用户昵称 |
黄天宇 |
运行时间 |
0.000 s |
代码语言 |
C++ |
内存使用 |
0.00 MiB |
提交时间 |
2023-11-15 12:06:33 |
显示代码纯文本
#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
int fa[20005];
int find(int x){
if(fa[x]==x) return x;
else return find(fa[x]);
}
int n,m;
struct l{
int v;
int ver;
}e[200005];
bool cmp(l a,l b){
return a.v<b.v;
}
bool b[200005];
int sum;
int num;
bool flag,flag2;
int main(){
freopen("cogito.in","r",stdin);
freopen("cogito.out","w",stdout);
cin>>n>>m;
for(int i=1;i<=n;i++){
cin>>e[i].v;
fa[i]=i;
}
for(int i=1;i<=m;i++){
int s,t;
cin>>s>>t;
fa[s]=t;
}
if(n==1){
cout<<e[1].v<<endl;
return 0;
}
sort(e+1,e+1+n,cmp);
for(int i=1;i<=n;i++){
if(b[i]) continue;
b[i]=1;
for(int j=1;j<=n;j++){
if(i==j) continue;
if(fa[i]==fa[j]&&!b[j]){
flag2=1;
b[j]=1;
for(int k=1;k<=n;k++){
if(i==k||j==k) continue;
if(fa[k]==fa[j]&&!b[k]){
b[k]=1;
flag=1;
int x=k;
if(e[j].v<e[k].v+e[i].v){
for(int h=1;h<=n;h++){
if(h==i||h==j||h==k continue;
if(fa[h]==fa[k]){
b[h]=1;
}
}
sum+=e[k].v+e[i].v;
}else sum+=e[j].v;
}
if(!flag){
sum+=min(e[i].v,e[j].v);
}
}
}
if(!flag2) sum+=e[i].v;
}
}
cout<<sum<<endl;
return 0;
}