【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;
	}
}
posted @ 2021-01-26 19:52  Hyx'  阅读(42)  评论(0)    收藏  举报