求dalao调教
查看原帖
求dalao调教
1232566
Wh1t3zZlo楼主2024/9/11 16:29
#include<iostream>
#include<algorithm>
#include<vector>
using namespace std;

vector<int>vec;

int fa[200005];

struct MyStruct
{
	int x, y,z;
}a[100005];

int find(int x)
{
	if (fa[x] == x) return x;
	return fa[x] = find(fa[x]);
}

bool cmp(MyStruct x, MyStruct y)
{
	return(x.z > y.z);
}

void merge(int x, int y)
{
	fa[find(x)]=find(y);
}

int main()
{
	int t;
	cin >> t;
	while (t--)
	{
		int n,flag=0;
		cin >> n;
		for (int i = 0; i <= n; i++)
		{
			fa[i] = i;
		}
		for (int i = 1; i <= n; i++)
		{
			cin >> a[i].x >> a[i].y>>a[i].z;
			vec.push_back(a[i].x);
			vec.push_back(a[i].y);
		}
		sort(vec.begin(), vec.end());
		int reu = unique(vec.begin(), vec.end()) - vec.begin();
		for (int i = 1; i <= n; ++i) {
			a[i].x = lower_bound(vec.begin(), vec.begin() + reu, a[i].x) - vec.begin();
			a[i].y = lower_bound(vec.begin(), vec.begin() + reu, a[i].y) - vec.begin();
		}
		sort(a + 1, a + 1 + n, cmp);
		for (int i = 1; i <= n; i++)
		{
			int x = a[i].x;
			int y = a[i].y;
			if (a[i].z == 1)
			{
				merge(x, y);
			}
			else if(find(x) == find(y))
			{
				cout << "NO" << endl;
				flag = 1;
				break;
			}
		}
		vec.clear();
		if (flag) continue;
		else cout << "YES" << endl;
	}
	return 0;
}

WA#2#3#8,思路和第一个题解一样,写出来就是70 照着他改了很久还是70,还有有点疑惑,为什么 并查集fa数组要开2e5,不然#2会RE,离散化后 最大不是1e5吗,为什么fa数组要开2e5

2024/9/11 16:29
加载中...