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;
    }
    
  • 相关阅读:
    Spring static 静态属性注入
    大众点评Cat--架构分析
    rxjava
    TCP/IP协议三次握手与四次握手流程解析
    [SDOI2014]数数
    CF-GYM101741K. Consistent Occurrences
    [JSOI2012]玄武密码
    [POI2000]病毒
    [JSOI2007]文本生成器
    [HNOI2006]最短母串问题
  • 原文地址:https://www.cnblogs.com/xsl19/p/13039862.html
Copyright © 2011-2022 走看看