CF 1242B B. 0-1 MST 补图连通块个数

原题链接

文章目录

题意

图是有n个点组成的完全图,其中有m条边的权值为1,剩余权值为0,问将图连通的最小代价是多少。

分析

看题意就觉得是简单的生成树问题,但因为是完全图,因此没办法把所有边都存下来。因此我们考虑怎么去求补图的连通块,因为如果将边权为0的边全部用完,最后的代价就是剩余的连通块个数-1。

我们可以用set来存边,再开一个set存点是否被遍历过,如果被遍历过则从set中删去,每次找下一个点时,只要当前点没有与下个点连边,即可以到达,因为是求补图,所以用set中的查询方法轻松搞定。但记住不能在遍历set时删去元素,这样会导致迭代器无法正常工作。

AC Code

#include <bits/stdc++.h>
#define fi first
#define se second
#define pb push_back
#define ACM_LOCAL
using namespace std;
typedef long long ll;
typedef long long ll;
typedef pair<int, int> PII;
const int N = 1e5 + 10, M = 2e5 + 10, INF = 0x3f3f3f3f;
const int MOD = 1e9 + 7;
int n, m;
int vis[N];
set<int> g[N], mp;
void dfs(int u) {
    
    
    vector<int> vec;
    for (auto it : mp) {
    
    
        if (g[u].find(it) == g[u].end()) vec.push_back(it);
    }
    for (auto it : vec) mp.erase(it);
    for (auto it : vec) dfs(it);
}
void solve() {
    
    
    cin >> n >> m;
    for (int i = 1; i <= n; i++) mp.insert(i);
    for (int i = 1; i <= m; i++) {
    
    
        int u, v; cin >> u >> v;
        g[u].insert(v); g[v].insert(u);
    }
    int ans = 0;
    
    for (int i = 1; i <= n; i++)
        if (mp.find(i) != mp.end()) dfs(i), ans++;
    cout << ans - 1 << endl;
}

signed main() {
    
    
    ios_base::sync_with_stdio(false);
    cin.tie(0);
    cout.tie(0);
#ifdef ACM_LOCAL
    freopen("Test/input", "r", stdin);
    freopen("Test/output", "w", stdout);
#endif
    solve();
    return 0;
}
/*
 * ┌───┐   ┌───┬───┬───┬───┐ ┌───┬───┬───┬───┐ ┌───┬───┬───┬───┐ ┌───┬───┬───┐
 * │Esc│   │ F1│ F2│ F3│ F4│ │ F5│ F6│ F7│ F8│ │ F9│F10│F11│F12│ │P/S│S L│P/B│  ┌┐    ┌┐    ┌┐
 * └───┘   └───┴───┴───┴───┘ └───┴───┴───┴───┘ └───┴───┴───┴───┘ └───┴───┴───┘  └┘    └┘    └┘
 * ┌───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───────┐ ┌───┬───┬───┐ ┌───┬───┬───┬───┐
 * │~ `│! 1│@ 2│# 3│$ 4│% 5│^ 6│& 7│* 8│( 9│) 0│_ -│+ =│ BacSp │ │Ins│Hom│PUp│ │Num│ / │ * │ - │
 * ├───┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─────┤ ├───┼───┼───┤ ├───┼───┼───┼───┤
 * │ Tab │ Q │ W │ E │ R │ T │ Y │ U │ I │ O │ P │{ [│} ]│ | \ │ │Del│End│PDn│ │ 7 │ 8 │ 9 │   │
 * ├─────┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴─────┤ └───┴───┴───┘ ├───┼───┼───┤ + │
 * │ Caps │ A │ S │ D │ F │ G │ H │ J │ K │ L │: ;│" '│ Enter  │               │ 4 │ 5 │ 6 │   │
 * ├──────┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴────────┤     ┌───┐     ├───┼───┼───┼───┤
 * │ Shift  │ Z │ X │ C │ V │ B │ N │ M │< ,│> .│? /│  Shift   │     │ ↑ │     │ 1 │ 2 │ 3 │   │
 * ├─────┬──┴─┬─┴──┬┴───┴───┴───┴───┴───┴──┬┴───┼───┴┬────┬────┤ ┌───┼───┼───┐ ├───┴───┼───┤ E││
 * │ Ctrl│ Win│ Alt│         Space         │ Alt│ Win│Menu│Ctrl│ │ ← │ ↓ │ → │ │   0   │ . │←─┘│
 * └─────┴────┴────┴───────────────────────┴────┴────┴────┴────┘ └───┴───┴───┘ └───────┴───┴───┘
 */

猜你喜欢

转载自blog.csdn.net/kaka03200/article/details/111410582