题目:https://pintia.cn/problem-sets/994805342720868352/problems/994805500414115840
标准图的DFS写法,最好看一下,难度不是很大

代码

  1. #include<vector>
  2. #include<algorithm>
  3. #include<iostream>
  4. #include<cstring>
  5. #include<cstdio>
  6. using namespace std;
  7. const int N = 1111;
  8. vector<int> G[N];//邻接表
  9. bool vis[N];
  10. int current_point;
  11. void dfs(int v){
  12. if(v == current_point) return;
  13. vis[v] = true;
  14. for(int i = 0; i < G[v].size(); i++){
  15. if(vis[G[v][i]] == false) dfs(G[v][i]);
  16. }
  17. }
  18. int main(){
  19. int n, m, k;
  20. scanf("%d %d %d", &n, &m, &k);
  21. for(int i = 0; i < m; i++){
  22. int a,b;
  23. scanf("%d%d", &a, &b);
  24. G[a].push_back(b);//a的边里面有b
  25. G[b].push_back(a);
  26. }
  27. for(int i = 0; i < k; i++){
  28. scanf("%d", &current_point);
  29. memset(vis, false, sizeof(vis));
  30. int block = 0;//连通块个数
  31. for(int i = 1; i <= n; i++){
  32. if(i != current_point && vis[i] == false){
  33. dfs(i);
  34. block++;
  35. }
  36. }
  37. printf("%d\n", block - 1);
  38. }
  39. }