zoukankan      html  css  js  c++  java
  • 题解【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;
    }
    
  • 相关阅读:
    ceph(4)--Ceph 的基础数据结构
    ceph(3)--Ceph 物理和逻辑结构
    ceph(2)--Ceph RBD 接口和工具
    ceph(1)--安装和部署
    Ceph中文文档
    Linux系统介绍(五)常用命令
    Linux系统介绍(四)IO重定向与管道
    剑指offer:跳台阶
    剑指offer:斐波那契数列
    剑指offer:旋转数组的最小数字
  • 原文地址:https://www.cnblogs.com/xsl19/p/13039862.html
Copyright © 2011-2022 走看看