算法題_朋友圈

在這裏插入圖片描述

在這裏插入圖片描述

思路: 這是一個並查集問題。

接下來我們用C++進行編程:

#include <bits/stdc++.h>
using namespace std;
const int MAX_N = 2e5 + 5;
int par[MAX_N], cnt[MAX_N];
unordered_map<int ,int> umap;

void init(int n)
{
	for(int i = 0; i < n; i++)
	{
		par[i] = i;
		cnt[i] = 1;
	}
}

//查找根結點
int find(int x)
{
	if(par[x] == x)
		return x;
	else
		return par[x] = find(par[x]);
}

//合併
void joint(int x, int y)
{
	if(find(x) == find(y))
		return;
	cnt[par[y]] += cnt[par[x]];
	par[par[x]] = par[y];
}

int main(){
	int T;
	cin >> T;
	while(T--)
	{
		int n;
		cin >> n;
		int x, y;
		init(2 * n + 5);
		umap.clear();
		int cntv = 0;
		for(int i = 0; i < n; i++)
		{
			cin >> x >> y;
			if(umap.find(x) == umap.end())
			{
				++cntv;
				umap[x] = cntv;
			}
			if(umap.find(y) == umap.end())
			{
				++cntv;
				umap[y] = cntv;
			}
			joint(umap[x], umap[y]);
		}
		int result = 0;
		for(int i = 0; i <= cntv; i++)
			result = max(result, cnt[find(i)]);
		cout << result << endl;
	}
	return 0;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章