并查集算法

简介:
#include <iostream>
#include <cstring>
#include <string>
using namespace std;

const int MAX_NUM = 100;
string name[MAX_NUM];
int group[MAX_NUM];
int rank[MAX_NUM];

void MakeSet()
{
	for (int i = 0; i < MAX_NUM; ++i)
	{
		group[i] = i;
		rank[i] = 0;
	}
}

int FindGroup(int i)
{
	if (group[i] == i)
	{
		return group[i];
	}

	group[i] = FindGroup(group[i]);
}

int MyFoundGroup(int i)
{
	return group[i];
}

void Union(int i, int j)
{
	int g1 = FindGroup(group[i]);
	int g2 = FindGroup(group[j]);

	if (rank[g1] > rank[g2])
	{
		group[j] = g1;
	}
	else
	{
		group[i] = g2;
		if (rank[g1] == rank[g2])
		{
			rank[g2]++;
		}
	}
}

bool JudgeGroup(string name1, string name2)
{
	int index1 = -1;
	int index2 = -1;

	for (int i = 0; i < MAX_NUM; ++i)
	{
		if (name1 == name[i])
		{
			index1 = i;
			break;
		}
	}

	for (int i = 0; i < MAX_NUM; ++i)
	{
		if (name2 == name[i])

		{
			index2 = i;
			break;
		}
	}

	return MyFoundGroup(group[index1]) == MyFoundGroup(group[index2]);
}

int main()
{
	name[0]="小明";
	name[1]="小王";
	name[2]="小军";
	name[3]="小丽";
	name[4]="小李";
	MakeSet();
	Union(0,1);
	Union(2,1);
	Union(3,4);

	string name1,name2;
	cin >> name1 >> name2;

	if(JudgeGroup(name1,name2))
	{
		cout << name1 << " 和 " << name2 << "是队友." << endl;
	}
	else
	{
		cout << name1 << " 和 " << name2 << "不是队友" << endl;
	}

	system("pause");
	return 0;
}

目录
相关文章
|
1月前
|
机器学习/深度学习 存储 算法
【算法沉淀】刷题笔记:并查集 带权并查集+实战讲解
【算法沉淀】刷题笔记:并查集 带权并查集+实战讲解
|
4月前
|
算法
并查集的实现【学习算法】
并查集的实现【学习算法】
23 0
|
4月前
|
算法
算法专栏 ---- trie树,并查集
算法专栏 ---- trie树,并查集
|
9月前
|
算法
算法 - 蓝桥杯并查集题型
算法 - 蓝桥杯并查集题型
|
10月前
|
存储 算法
从小白开始刷算法 并查集篇 leetcode.547
从小白开始刷算法 并查集篇 leetcode.547
|
10月前
|
存储 算法 索引
从小白开始刷算法 并查集篇 leetcode.200
从小白开始刷算法 并查集篇 leetcode.200
|
10月前
|
存储 算法 API
LeetCode算法小抄 -- 经典图论算法 之 并查集算法
LeetCode算法小抄 -- 经典图论算法 之 并查集算法
|
存储 算法
给我三分钟,带你领略热血江湖中的并查集算法
给我三分钟,带你领略热血江湖中的并查集算法
给我三分钟,带你领略热血江湖中的并查集算法
|
存储 算法
【数据结构与算法】并查集
【数据结构与算法】并查集
【数据结构与算法】并查集
|
算法
最小生成树:Kruskal算法(邻接表+最小堆+并查集)
最小生成树:Kruskal算法(邻接表+最小堆+并查集)
211 0
最小生成树:Kruskal算法(邻接表+最小堆+并查集)