题目:戳这里
题意:给n个城市,m条边,再给k种情况,每种情况都有一个城市与其他城市隔离,问其他城市需要加多少条边才能互相连通。
解题思路:巧用vis数组,如果x城市与其他城市隔离,那么令vis[x]=1,假设该城市已经遍历过即可,接下来就是直接深搜遍历城市,需要遍历y遍,就需要加y-1条边,看起来很暴力,但其实每个点也就遍历1次而已,整体来说是O(n^2)的复杂度。
代码:
#include <iostream>
#include <cstring>
#include <algorithm>
#include <map>
using namespace std;
typedef long long ll;
const int maxn = 3e3 + 10;
bool nu[maxn][maxn];
bool vis[maxn];
int n, m, k;
void dfs(int x) {
for(int i = 1; i <= n; ++i) {
if(!nu[x][i] || vis[i]) continue;
vis[i] = 1;
dfs(i);
}
}
int main() {
scanf("%d %d %d", &n, &m, &k);
int u, v;
for(int i = 1; i <= m; ++i) {
scanf("%d %d", &u, &v);
nu[u][v] = 1;
nu[v][u] = 1;
}
for(int i = 1; i <= k; ++i) {
scanf("%d", &u);
int ans = 0;
memset(vis, 0, sizeof(vis));
vis[u] = 1;
for(int j = 1; j <= n; ++j) {
if(!vis[j]) {
dfs(j);
++ans;
}
}
printf("%d\n", ans - 1);
}
return 0;
}