D - Tying Rope

D - Tying Rope (atcoder.jp)

这个题的目的是判断自环。根据题意,当这两条绳子出现两次的时候他们就连成了自环,所以我们可以根据这个判断他们是否能连成自环。首先我们要记录下每次连接的两端绳子,然后我们用并查集记录下来。用并查集合并他们。第二次再遇到这两条绳子的时候,这两条绳子之前已经合并了,所以他们一定能连成自环 ,ans1 ++。然后每次连接的时候都会有两个绳子变成不是单独一条的,所以每次ans2 --。因为每次ans2 都要减,所以可以放在最后再减。

代码如下:

#include <bits/stdc++.h>
#define int long long 
using namespace std;
constexpr int N = 2e5 + 10;
int f[N];
int find(int x)
{
	return x == f[x] ? f[x] : f[x] = find(f[x]);
}

signed main()
{
	int n, m; cin >> n >> m;
	int ans1 = 0, ans2 = n;
	for (int i = 1; i <= n; i ++) f[i] = i;
	for (int i = 1; i <= m; i ++)
	{
		int a, b;
		char c, d;
		cin >> a >> c >> b >> d;
		if (find(a) == find(b)) ans2 --, ans1 ++; // 如果这两个数已经在一个共同祖先上了,再连一次就会形成闭环,所以 ans1 ++, 每次相连的时候都会少一个单独的,所以 ans2 --;
		// 可以判断他们是否连接 
		else {f[find(a)] = find(b), ans2 --;}
	}
	cout << ans1 << " " << n - m << "\n";
	return 0;
}

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值