题意
图是有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 │ . │←─┘│
* └─────┴────┴────┴───────────────────────┴────┴────┴────┴────┘ └───┴───┴───┘ └───────┴───┴───┘
*/