zoukankan      html  css  js  c++  java
  • 洛谷P1396 营救 题解 并查集+贪心

    题目链接:https://www.luogu.com.cn/problem/P1396

    解题思路:
    贪心思想,按照边的拥挤度从小到大合并两个点,每次合并之后判断 (s)(t) 是否在一个集合中,
    如果不在,则继续;如果在,就输出这条边的拥挤度并结束。

    实现代码如下:

    #include <bits/stdc++.h>
    using namespace std;
    const int maxn = 10010, maxm = maxn*2;
    int n, m, s, t, f[maxn];
    struct Edge {
        int u, v, w;
    } edge[maxm];
    bool cmp(Edge a, Edge b) {
        return a.w < b.w;
    }
    void init() {
        for (int i = 1; i <= n; i ++) f[i] = i;
    }
    int Find(int x) {
        return x == f[x] ? x : f[x] = Find(f[x]);
    }
    void Union(int x, int y) {
        int a = Find(x), b = Find(y);
        f[a] = f[b] = f[x] = f[y] = min(a, b);
    }
    int main() {
        cin >> n >> m >> s >> t;
        init();
        for (int i = 0; i < m; i ++) cin >> edge[i].u >> edge[i].v >> edge[i].w;
        sort(edge, edge+m, cmp);
        for (int i = 0; i < m; i ++) {
            Union(edge[i].u, edge[i].v);
            if (Find(s) == Find(t)) {
                cout << edge[i].w << endl;
                break;
            }
        }
        return 0;
    }
    
  • 相关阅读:
    《梦段代码》阅读笔记03
    用户场景
    冲刺!
    冲刺!
    周总结8
    冲刺!
    冲刺!
    PMS权限管理和鉴权过程
    PMS构造函数以及apk如何扫描
    PMS的学习之旅
  • 原文地址:https://www.cnblogs.com/quanjun/p/12340757.html
Copyright © 2011-2022 走看看