题解【Codeforces1184E1】Daleks' Invasion (easy)

题面

首先不考虑第一条边,跑一遍 Kruskal 最小生成树。

对于每一条边,如果它连接的两个连通分量恰好为第一条边两端点的连通分量,那么答案即为这一条边的权值。

如果没有找到这一种边,就说明这一条边是图中的一条割边,直接输出 (10^9) 即可。

#include <bits/stdc++.h>

using namespace std;

inline int gi()
{
    int f = 1, x = 0; char c = getchar();
    while (c < '0' || c > '9') {if (c == '-') f = -1; c = getchar();}
    while (c >= '0' && c <= '9') x = x * 10 + c - '0', c = getchar();
    return f * x;
}

const int INF = 0x3f3f3f3f, N = 100003, M = 1000001;

int n, m;
int fa[N];
struct Node
{
	int u, v, w;
} a[M];

inline bool cmp(Node x, Node y)
{
	return x.w < y.w;
}

int getf(int u) 
{
	if (fa[u] == u) return u;
	return fa[u] = getf(fa[u]);
}

int main()
{
    n = gi(), m = gi();
    for (int i = 1; i <= m; i+=1)
    	a[i].u = gi(), a[i].v = gi(), a[i].w = gi();
    for (int i = 1; i <= n; i+=1) fa[i] = i;
    sort(a + 2, a + 1 + m, cmp);
    bool fl = true;
    for (int i = 2; i <= m; i+=1)
    {
    	int u = getf(a[i].u), v = getf(a[i].v);
    	if (u != v)
    	{
    		int x = getf(a[1].u), y = getf(a[1].v);
    		if ((x == u && y == v) || (x == v && y == u))
    		{
    			printf("%d
", a[i].w);
    			fl = false;
    			break;
    		}
    		fa[u] = v;
    	}
    }
    if (fl) puts("1000000000");
    return 0;
}
原文地址:https://www.cnblogs.com/xsl19/p/13039862.html