60分TLE求助
查看原帖
60分TLE求助
342868
qfpjm楼主2021/8/10 15:19
#include <bits/stdc++.h>

using namespace std;

long long n, m, a[100005], S[100005], E[100005], W[100005];
long long parent[100005];
long long l, r = 1e9;
bool flag;

int find(long long v1)
{
	while (v1 != parent[v1])
	{
		v1 = parent[v1];
	}
	return v1;
}

void _union(long long v1, long long v2)
{
	int p1 = find(v1);
	int p2 = find(v2);
	if (p1 != p2)
	{
		parent[p1] = p2;
	}
}

bool isSame(int v1, int v2)
{
	return find(v1) == find(v2);
}

bool check(long long x)
{
	for (int i = 1 ; i <= 100005 ; i ++)
	{
		parent[i] = i;
	}
	for (int i = 1 ; i <= m ; i ++)
	{
		if (W[i] >= x)
		{
			_union(S[i], E[i]);
		}
	}
	for (int i = 1; i <= n; i ++) 
	{
        if (!isSame(i, a[i])) 
		{ 
			return false; 
		}
    }
    return true;
}

int main()
{
	cin >> n >> m;
	for (int i = 1 ; i <= n ; i ++)
	{
		scanf("%d", &a[i]);
		if (a[i] != i)
		{
			flag = true;
		}
	}
	for (int i = 1 ; i <= m ; i ++)
	{
		scanf("%d%d%d", &S[i], &E[i], &W[i]);
		_union(S[i], E[i]);
	}
	if (!flag)
	{
		puts("-1");
		return 0;
	}
	while (l < r)
	{
		long long mid = (l + r + 1) >> 1;
		if (check(mid))
		{
			l = mid;	
		}
		else
		{
			r = mid - 1;
		}
	}
	cout << l;
	return 0;
}

2021/8/10 15:19
加载中...