大佬们60,救救
查看原帖
大佬们60,救救
938991
zdrtgb159753楼主2025/2/7 09:45
#include<bits/stdc++.h>
using namespace std;
const int N = 310;
int w[N],p[N][N],o[N];
int n,pos;
long long res;

struct E{
    int a;
    int b;
    int w;
    bool operator < (const E& rhs){
        return this->w < rhs.w;
    }
}edg[N*N+N];

int find(int a){
    if(o[a] != a && o[a] != -1) o[a] = find(o[a]);
    return o[a];
}

void klskr(){
    for(int i = 0; i < pos; i++){
        //其他的代码和kruscal一样,就加了这一部分,来判断取井,我这里设置井的两个端点一样,所以可以判断是否为井,一旦取井则说明这条路上(并查集)中都可以实现,所以就用-1表示
        if(edg[i].a == edg[i].b){
            int pa = find(edg[i].a);
            if(pa != -1){
                res += edg[i].w;
                //printf("%d\n",edg[i].w);
                o[pa] = -1;
            }
        }else{
            int pa = find(edg[i].a);
            int pb = find(edg[i].b);
            if(pa != pb){
                res += edg[i].w;
                //printf("%d\n",edg[i].w);
                o[pa] = pb;
            }
        }
    }
}

int main(){
    cin>>n;
    for(int i = 0; i < n; i++){
        o[i] = i;
        cin>>w[i];
        edg[i] = {i,i,w[i]};
    }
    for(int i = 0; i < n; i++){
        for(int j = 0; j < n; j++) cin>>p[i][j];
    }
    pos = n;
    for(int i = 0; i < n; i++){
        for(int j = i+1; j < n; j++){
                edg[pos++] = {i,j,p[i][j]};
        }
    }
    sort(edg,edg+pos);
    klskr();
    printf("%lld",res);
    return 0;
}
2025/2/7 09:45
加载中...