我被分配了一个项目,我必须接受一堆节点,以及某些节点之间有权重的边。
然后,我必须使用此信息为图形的每个连接组件查找最小生成树(因此,如果图形具有两个连接组件,则需要创建两个生成树)
问题是我不能使用任何STL库,除了。
我知道我需要创建自己的数据结构,但我不知道我需要哪些数据结构。我想最小的堆对于找到要使用的最低权重边缘是有用的,但我将如何为每个连接的组件创建最小堆?
我认为我需要实现union-find才能组织连接组件集。
我需要为此实现哪些其他数据结构?
答案 0 :(得分:1)
对于union-find,你需要实现DISJOINT SET。
这里是使用简单数组的简单实现..看看
// Disjoint Set implementation
// Shashank Jain
#include<iostream>
#define LL long long int
#define LIM 100005
using namespace std;
int p[LIM],n; // p is for parent
int rank[LIM];
void create_set()
{
for(int i=1;i<=n;i++)
{
p[i]=i;
rank[i]=0;
}
}
int find_set(int x)
{
if(x==p[x])
return x;
else
{
p[x]=find_set(p[x]);
return p[x];
}
}
void merge_sets(int x,int y)
{
int px,py;
px=find_set(x);
py=find_set(y);
if(rank[px]>rank[py])
p[py]=px;
else
if(rank[py]>rank[px])
p[px]=py;
else
if(rank[px]==rank[py])
{
p[px]=py;
rank[py]++;
}
}
int main()
{
cin>>n; // no: of vertex , considering that vertex are numbered from 1 to n
create_set();
int a,b,q,i;
cin>>q; // queries
while(q--)
{
cin>>a>>b;
merge_sets(a,b);
}
for(i=1;i<=n;i++)
{
cout<<find_set(i)<<endl; // vertex having same value of find_set i.e same representative of set are in same subset
}
return 0;
}
答案 1 :(得分:0)
我将假设你可以选择你的MST算法并且输出是一个边缘列表。 Borůvka's algorithm易于实现,除了图形和不相交的集合结构之外,不需要任何数据结构。相比之下,Prim的算法需要一个优先级队列和一些逻辑来处理断开连接的图形,而Kruskal的算法需要一个不相交的集合结构和一个排序算法。我会像这样设置数据结构。每个事件顶点边对都有一个邻接记录。
struct Adjacency;
struct Edge {
int weight;
};
struct Vertex {
struct Adjacency *listhead; // singly-linked list of adjacencies
struct Vertex *parent; // union-find parent
};
struct Adjacency {
struct Adjacency *listnext;
struct Edge *edge;
struct Vertex *endpoint; // the "other" endpoint
};