需要修的高速公路条数是连通块个数减一
城市被占领,可以在DFS和DFSTrave函数中,对该顶点跳过处理
#include <bits/stdc++.h>
using namespace std;
const int maxn = 1010;
int n, m, k, city, cnt;
vector<int> g[maxn];
bool vis[maxn];
void DFS(int u)
{
vis[u] = true;
for(int i = 0; i < g[u].size(); ++i) {
int id = g[u][i];
if(id != city && !vis[id]) DFS(id);
}
}
void DFSTrave()
{
for(int i = 1; i <= n; ++i) {
if(i != city && !vis[i]) {
++cnt;
DFS(i);
}
}
}
int main()
{
scanf("%d %d %d", &n, &m, &k);
while(m--) {
int u, v;
scanf("%d %d", &u, &v);
g[u].push_back(v);
g[v].push_back(u);
}
while(k--) {
scanf("%d", &city);
memset(vis, false, sizeof(vis));
cnt = 0;
DFSTrave();
printf("%d\n", cnt - 1);
}
return 0;
}