【1013 25 dfs连通块】 Battle Over Cities
传送门
题意
给定 \(n\) 个节点,\(m\) 条边的图,边通过 \((u,v)\) 形式给出,表示 \(u、v\) 之间存在边,给出 \(k\) 个询问,每个询问包含一个节点,删除此节点及其边后剩余的点存在同一个连通块中需要增加的边数
数据范围
\(1\leq N\leq 1000\)
题解
- 所有点原先是全部连通的,只要求出去掉某一个点后的连通块数即可,将分离的连通块连接起来需要连通块数 - 1条边
- 存在稠密图的测试例,使用邻接矩阵存更好
Code
#include <bits/stdc++.h>
using namespace std;
const int N = 1010;
vector<int> edge[N];
vector<bool> st;
inline void dfs(int x) {
st[x] = true;
for (auto to : edge[x]) {
if (not st[to]) {
dfs(to);
}
}
}
int main() {
int n, m, k; cin >> n >> m >> k;
st.resize(n + 1);
while (m--) {
int u, v; cin >> u >> v;
edge[u].push_back(v);
edge[v].push_back(u);
}
while (k--) {
fill(st.begin(), st.end(), false);
int ask; cin >> ask;
st[ask] = true;
int block = 0;
for (int i = 1; i <= n; i++) {
if (not st[i]) {
++block;
dfs(i);
}
}
cout << block - 1 << endl;
}
}

浙公网安备 33010602011771号