1 条题解

  • 0
    @ 2023-10-16 20:01:18

    C++ :

    #include <bits/stdc++.h>
    using namespace std;
    
    const int N = 1e5 + 5;
    int n, m, p[N], a[N], b[N], w[N], ra[N], fa[N];
    //vector < int > G[N];
    
    int Get(int x)
    {
    //	printf("%d\n******", x);
    	if (fa[x] == x) return x;
    	return fa[x] = Get(fa[x]);
    }
    
    inline void Merge(int x, int y)
    {
    	int fx = Get(x), fy = Get(y);
    	if (fx == fy) return;
    	if (ra[fx] < ra[fy]) fa[fx] = fy;
    	else
    	{
    		fa[fy] = fx;
    		if (ra[fx] == ra[fy]) ++ra[fy];
    	}
    }
    
    inline bool Check(int x)
    {
    	for (register int i = 1; i <= n; ++i)
    		fa[i] = i;//, G[i].erase(G[i].begin(), G[i].end());
    	memset(ra, 0, sizeof(ra));
    	for (register int i = 1; i <= m; ++i)
    		if (w[i] >= x) Merge(a[i], b[i]);
    //	for (register int i = 1; i <= n; ++i)
    //		G[Get(i)].push_back(i);
    	for (register int i = 1; i <= n; ++i)
    	{
    //		writeln(i);
    //		printf("%d %d\n", x, i); 
    //		printf("%d %d\n", i, Get(i));
    		if (Get(p[i]) != Get(i)) return 0;
    	}
    	return 1;
    }
    
    int main()
    {
    //	freopen("wormsort.in", "r", stdin);
    //	freopen("wormsort.out", "w", stdout);
    	scanf("%d%d", &n, &m);
    	for (register int i = 1; i <= n; ++i)
    		scanf("%d", p + i);
    	for (register int i = 1; i <= m; ++i)
    		scanf("%d%d%d", a + i, b + i, w + i);
    //	if (n == 4 && m == 4 && p[1] == 3 && p[2] == 2 && p[3] == 1 && p[4] == 4) puts("9");
    //	else puts("-1");
    	int lft = 0, rgh = 1e9 + 2, ans = -1;
    	while (lft <= rgh)
    	{
    		int md = (lft + rgh) >> 1;
    		if (Check(md))
    		{
    			ans = md;
    			lft = md + 1;
    		}
    		else rgh = md - 1;
    	}
    	if (ans == int(1e9 + 2)) ans = -1;
    	printf("%d\n", ans);
    	return 0;
    }
    
    

    信息

    ID
    760
    时间
    1000ms
    内存
    256MiB
    难度
    2
    标签
    递交数
    5
    已通过
    5
    上传者