题目:https://pintia.cn/problem-sets/994805342720868352/problems/994805500414115840
标准图的DFS写法,最好看一下,难度不是很大
代码
#include<vector>#include<algorithm>#include<iostream>#include<cstring>#include<cstdio>using namespace std;const int N = 1111;vector<int> G[N];//邻接表bool vis[N];int current_point;void dfs(int v){if(v == current_point) return;vis[v] = true;for(int i = 0; i < G[v].size(); i++){if(vis[G[v][i]] == false) dfs(G[v][i]);}}int main(){int n, m, k;scanf("%d %d %d", &n, &m, &k);for(int i = 0; i < m; i++){int a,b;scanf("%d%d", &a, &b);G[a].push_back(b);//a的边里面有bG[b].push_back(a);}for(int i = 0; i < k; i++){scanf("%d", ¤t_point);memset(vis, false, sizeof(vis));int block = 0;//连通块个数for(int i = 1; i <= n; i++){if(i != current_point && vis[i] == false){dfs(i);block++;}}printf("%d\n", block - 1);}}
