求助,kruskal写挂了,90分
  • 板块P1194 买礼物
  • 楼主FutureThx
  • 当前回复9
  • 已保存回复9
  • 发布时间2020/9/16 20:48
  • 上次更新2023/11/5 13:07:09
查看原帖
求助,kruskal写挂了,90分
355559
FutureThx楼主2020/9/16 20:48

RT

#include <iostream>
using namespace std;
int find_father(int x);
void build(int x,int y,int z);
void kp(int l,int r);
void kruskal();
void read();
void out();
struct tree{
    int u,v,data;
}edge[500001];
int f[500001],A,B,m = 0,edge_num = 0,edge_t = 0;
int main(){
    read();
    kp(1,m);
    kruskal();
    out();
    return 0;
}
int find_father(int x){
    if(f[x] == x)
       return x;
    return f[x] = find_father(f[x]);
}
void build(int x,int y,int z){
    m++;
    edge[m].u = x;
    edge[m].v = y;
    edge[m].data = z;
}
void kp(int l,int r){
    int i = l,j = r,mid = edge[(l+r)/2].data;
    do{
        while(edge[i].data < mid)i++;
        while(edge[j].data > mid)j--;
        if(i <= j){
            swap(edge[i],edge[j]);
            i++;
            j--;
        }
    }while(i <= j);
    if(i < r)kp(i,r);
    if(l < j)kp(l,j);
}
void kruskal(){
    for(int i = 1;i <= m;i++){
        if(find_father(edge[i].u) != find_father(edge[i].v)){
            f[find_father(edge[i].u)] = find_father(edge[i].v);
            edge_t++;
            edge_num += edge[i].data;
        }
        if(edge_t == B - 1)
            break;
    }
    edge_num += A;
}
void read(){
    cin >> A >> B;
    int x;
    for(int i = 1;i <= B;i++){
        for(int j = 1;j <= B;j++){
            cin >> x;
            if(i < j && x != 0)
                build(i,j,x);
        }
    }
    for(int i = 1;i <= B;i++)
       f[i] = i;
}
void out(){
    cout << edge_num << endl;
}
2020/9/16 20:48
加载中...