题解 | #暂时没想法#

alt

M题-暂时没想法

https://ac.nowcoder.com/acm/contest/79000/M

————————

做本题你需要会dfs或者并查集。本题解使用的是并查集。

目录

读题:

题目中有重要信息,比如初始图肯定是两个“集合”以上。 (集合指的是两组城市,这两组间不存在通路)

然后是要重新建图,并且不能用原来的的路。

思路

如图: alt

(题目给的是上面那一行,我们的最终输出结果是下面的一行。

有大佬提示我了,我们最后的结果其实就是一颗树,所以ans大小就是n-1)

官方题解

alt

参考代码片:

void solve()
{
	int n, m;
	cin >> n >> m;
	init(n);
	for (int i = 0; i < m; i++)
	{
		int a, b;
		cin >> a >> b;
		join(a, b);
	}
	vector<int>group;//每组的头
	map<int, int>h;//头是第几个数组
	vector<vector<int>>members;//每组的成员
	for (int i = 1; i <= n; i++)
	{
		if (!h.count(find(i)))
		{
			h[find(i)] = group.size();
			group.push_back(i);
			members.push_back(vector<int>());
			members[h[find(i)]].push_back(i);
		}
		else
		{
			int tou = find(i);
			members[h[tou]].push_back(i);
		}
	}

	cout << "Yes" << endl;
	int ans = n-1;
// 	for (int i = 0; i < members.size(); i++)
// 	{
// 		if (i == members.size() - 1)
// 		{
// 			ans += members[0].size() - 1;
// 		}
// 		else
// 		{
// 			ans += members[i + 1].size();
// 		}
// 	}
	cout << ans << endl;
	for (int i = 0; i < members.size(); i++)
	{
		if (i == members.size() - 1)
		{
			for (auto x : members[0])
			{
				if(x!=group[0])
				cout << group[i] << " " << x << endl;
			}
		}
		else
		{
			for (auto x : members[i + 1])
			{
				cout << group[i] << " " << x << endl;
			}
		}
	}
}
全部评论
请问这个求ans是不是多余了,因为要建树,ans一定是n-1
1 回复 分享
发布于 03-31 15:16 湖南
不是按这题解老说,题目描述的有问题
1 回复 分享
发布于 04-03 22:38 河南

相关推荐

球球别再泡了:坏,我单9要了14
点赞 评论 收藏
分享
1 1 评论
分享
牛客网
牛客企业服务