比赛 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;
}