C++ 求不相交集的数目
对于不熟悉不相交集数据结构的用户 我试图从给定的朋友组和他们的关系中找出朋友组的数量。当然,毫无疑问,这可以使用BFS/DFS轻松实现。但是我选择使用不相交集,我也倾向于找到这个人所属的朋友组,等等,不相交集听起来当然适合这种情况 我已经实现了不相交集数据结构,现在我需要找到它包含的不相交集的数量(这将给出组的数量) 现在,我一直致力于实现如何高效地找到不相交集的数量,因为朋友的数量可能多达100个 我认为应该有效的选项C++ 求不相交集的数目,c++,algorithm,data-structures,disjoint-sets,disjoint-union,C++,Algorithm,Data Structures,Disjoint Sets,Disjoint Union,对于不熟悉不相交集数据结构的用户 我试图从给定的朋友组和他们的关系中找出朋友组的数量。当然,毫无疑问,这可以使用BFS/DFS轻松实现。但是我选择使用不相交集,我也倾向于找到这个人所属的朋友组,等等,不相交集听起来当然适合这种情况 我已经实现了不相交集数据结构,现在我需要找到它包含的不相交集的数量(这将给出组的数量) 现在,我一直致力于实现如何高效地找到不相交集的数量,因为朋友的数量可能多达100个 我认为应该有效的选项 把新的放在原来的后面,然后销毁旧的 在每个联合中更改每个元素的父元素 但
//不相交集概念
//https://www.topcoder.com/community/data-science/data-science-tutorials/disjoint-set-data-structures/
//最初,所有顶点都作为一个集合,它们是它们自己的代表。
//接下来我们看,比较两个顶点,如果它们有相同的父对象(集合的代表),我们将其保留。
//如果他们没有,我们就把他们合并成一组。
//最后我们得到不同的不相交集。
#包括。。。
使用名称空间std;
#定义边对
const int max 1000000;
矢量图;
int N,M;
int-parent[max];
int findset(int x,int*parent){
//找到集合代表。
如果(x!=父[x]){
父[x]=findset(父[x],父);
}
返回父项[x];
}
虚空不相交(){
for(int i=0;iN>>M;//朋友数和M边数
int u,v,w;//u=source,v=destination,w=weight(在这里没有用处)。
重置();
对于(inti=0;i>u>>v>>w;
图。推回(对(w,边(u,v));
}
不相交();
打印();
返回0;
}
如果您只需要知道不相交集的数量,而不是它们是什么,那么一个选项是在数据结构中添加一个计数器变量,计算有多少不相交集。最初,有n个不相交集,每个元素一个。每次执行并集操作时,如果两个元素没有相同的representative,那么你知道你正在将两个不相交的集合合并成一个集合,这样你就可以减少计数器的数量。看起来像这样:
if (pu != pv){ //if not in the same set.
numDisjointSets--; // <--- Add this line
mst.push_back(graph[i]);
total += graph[i].first;
parent[pu] = parent[pv]; // create the link between these two sets
}
if(pu!=pv){//if不在同一集合中。
NUMDISJ点集--;//在不相交集数据结构中,对两个项目a、b
的每个联合操作都有两种可能的情况:
您试图合并同一集合中的项目。在这种情况下,不执行任何操作,不相交集合的数量保持不变
您将两个不同集合中的项目合并在一起,因此基本上将两个集合聚合为一个集合-有效地将不相交集合的数量减少了一个
由此,我们可以得出结论,通过从上面跟踪(2)型并集的数量,可以很容易地找到每个时刻不相交集的数量。
如果我们用such\u unions
来表示这个数字,那么每个点的集合总数就是numberu\u of\u initial\u set-such\u unions
这个方法和保持联合操作总数的计数有什么不同吗?比如说,count=1初始值,我们每次调用联合时都增加count。回答得好!想要upv吗太好了!!!!!!!!!!
if (pu != pv){ //if not in the same set.
numDisjointSets--; // <--- Add this line
mst.push_back(graph[i]);
total += graph[i].first;
parent[pu] = parent[pv]; // create the link between these two sets
}