我正在编写一个算法类的c项目,我真的需要一些帮助! 这是问题所在:
我有一组像这样的名字N =(James,John,Robert,Mary,Patricia,Linda Barbara),它们存储在RB树中。 从这组名称开始,形成了一系列像这样的一对夫妇:
(詹姆斯,玛丽) (詹姆斯·帕特里夏) (约翰,琳达) (约翰,芭芭拉) (罗伯特,琳达) (罗伯特,巴巴拉)
现在我需要以一种方式合并元素,我可以形成n个子组,其约束条件是每个配对都被尊重,并且该组具有最小的基数。
在示例中,他们将组成两组 (James,Mary,Patricia)和(John,Robert,Barbara,Linda)。
任务是返回组中形成的最大组数和组中具有最大基数的男性和女性数。
在这种情况下,它将是2 2 2
我正在考虑构建一个图形,其中每个名称都由一个顶点表示,而两个顶点只有在它们配对时才在边缘。 然后,我可以使用算法(如Kruskal)来查找最小生成树。是吗?
问题是图表不会完全连接。 我还需要找到一种方法将名称映射到Graph的边缘,反之亦然。 边可以用字符串索引吗?
非常感谢每一个帮助:) 谢谢你的建议!
答案 0 :(得分:1)
您无需找到最小生成树。这实际上是为了找到图形中仍然保持图形连接的“最佳”边缘。换句话说,你不关心约翰和罗伯特是如何联系的,只是他们是。
你说的问题是图表不会完全连接,但我认为这实际上就是重点。如果您按照建议使用情侣来表示图形边缘,则连接的顶点将形成您要查找的组。
在你的例子中,詹姆斯与玛丽有联系,詹姆斯也与帕特里夏有联系。没有其他人连接到这三个顶点中的任何一个(如果他们这样做,你会有另外一对包含它们),这就是为什么他们组成一个单独的组(詹姆斯,玛丽,帕特里夏)。同样地,约翰,罗伯特,芭芭拉和琳达的所有人都相互联系。
你的任务实际上是形成图形并找到彼此不相交的所有连通子图。
虽然不是一个完整的算法,但我希望这有助于你开始。
答案 1 :(得分:0)
我认为您可以使用dfs和连接组件轻松解决此问题。因为每个人(节点)都与另一个人(边缘)有关系。因此,您有一个外部循环并为未访问的每个节点运行探索功能,并为探索功能探索的每个节点添加相同的数字。 e.g
dfs() {
int group 0;
for(int i=0;i<num_nodes;i++) {
if(nodes[i].visited==false){
explore(nodes[i],group);
group++;
}
}
然后你只需要按组对节点进行排序,然后就可以了。如果你想跟踪路径,你可以使用一个预编号来指示首先探索的节点,第二个..等等
(抱歉我的英语不好)!
答案 2 :(得分:0)
名称和名称对已形成图表。具有节点和指向其他节点的指针的数据结构只是另一种表示,您不一定需要这种表示。 Disjoint sets更容易实现IMO,它们在生活中的目的正是为了跟踪成对事物的相同性。