[POI2012] TOU-Tour de Byteotia

[POI2012] TOU-Tour de Byteotia - 并查集

Description

给定一个n个点m条边的无向图,问最少删掉多少条边能使得编号小于等于k的点都不在环上

Solution

删除一条边,只能破坏一个环

所以对于一个环来说,删除它的哪一条边,是没有区别的

因此,对于那些连接两个 >k 的点的边,我们可以把他们先连上

然后去处理那些剩下的边,如果加上去不会成环,就加上去

并查集维护即可

#include <bits/stdc++.h>
using namespace std;

#define int long long
const int N = 1e6 + 5;

int fa[N];

int find(int p)
{
    return p == fa[p] ? p : fa[p] = find(fa[p]);
}

void merge(int p, int q)
{
    p = find(p);
    q = find(q);
    if (p - q)
        fa[p] = q;
}

signed main()
{
    ios::sync_with_stdio(false);

    int n, m, k;
    cin >> n >> m >> k;

    for (int i = 1; i <= n; i++)
        fa[i] = i;

    vector<pair<int, int>> edge;
    for (int i = 1; i <= m; i++)
    {
        int p, q;
        cin >> p >> q;
        if (p > k && q > k)
            merge(p, q);
        else
            edge.push_back({p, q});
    }

    int ans = 0;

    for (auto [p, q] : edge)
    {
        if (find(p) == find(q))
            ans++;
        else
            merge(p, q);
    }

    cout << ans << endl;
}
原文地址:https://www.cnblogs.com/mollnn/p/14445417.html