gpt4 book ai didi

c++ - Kruskal 算法和不相交集数据结构 : Do I need the following two lines of code?

转载 作者:搜寻专家 更新时间:2023-10-31 01:57:34 25 4
gpt4 key购买 nike

我已经根据维基百科使用不相交集数据结构在 C++ 中实现了 Kruskal 算法,如下所示:

#include <stdio.h>
#include <algorithm>
#define MAX_EDGES 10000000
#define MAX_VERTICES 200001
using namespace std;
int num_edges,num_vertices;
int total_cost=0;

struct edge{
int v1,v2;
int cost;
};

struct comp{
bool operator()(const edge& e1,const edge& e2){
return e1.cost<e2.cost;
}
};

edge edges[MAX_EDGES];
int parent[MAX_VERTICES];
int rank[MAX_VERTICES];

int findset(int x){
if(x!=parent[x]){
parent[x]=findset(parent[x]);
}
return parent[x];
}

void merge(int x,int y){
int px=findset(x),py=findset(y);
if(rank[px]>rank[py]){
parent[py]=px;
}else{
parent[px]=py;
}
if(rank[px]==rank[py]){
++rank[py];
}
}

int main(){
FILE* in=fopen("input","r");
FILE* out=fopen("output","w");
fscanf(in,"%d %d\n",&num_vertices,&num_edges);
for(int i=1;i<=num_vertices;++i){
parent[i]=i;
rank[i]=0;
}
for(int i=0;i<num_edges;++i){
fscanf(in,"%d %d %d\n",&edges[i].v1,&edges[i].v2,&edges[i].cost);
}
sort(edges,edges+num_edges,comp());
for(int i=0;i<num_edges;++i){
int s1=findset(edges[i].v1),s2=findset(edges[i].v2);
if(s1!=s2){
merge(s1,s2);
total_cost+=edges[i].cost;
}
}
fprintf(out,"%d\n",total_cost);
}

我的问题是:我需要这两行代码吗?如果是,它们的重要性是什么?

  1. int px=findset(x),py=findset(y);在合并中而不是 int px=parent[x],py=parent[y];
  2. parent[x]=findset(parent[x]); 在findset 而不是 return
    findset(父[x]);

最佳答案

1) findset(x) 返回 x 所在的集合的规范代表(其祖先树的根)。你需要这个来比较两个元素是否在同一个集合中(它们有相同的代表),parent[x] 只是返回树中 x 的父元素,这可能不是成为根。

1a) 您忘记在 merge 中测试 px 和 py 是否相同。

2) 这是一项优化,以便将来对 findset 的调用运行得更快。如果 parent[x] 用于指向其父对象,而父对象指向其集合树的根,则在此调用之后 parent[x] 将直接指向根。

关于c++ - Kruskal 算法和不相交集数据结构 : Do I need the following two lines of code?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5442275/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com