PAT (Advanced Level) Practice 1013 Battle Over Cities (25分)

我不是女神ヾ 2023-06-30 02:37 108阅读 0赞

题意:一个连通图,删除一个结点后,至少连几条线可以将图再次还原成联连通图。显然,两个连通分量要一条,三个连通分量要两条,….N个连通分量要N-1条。深度优先搜索最外层的循环可判断到底有几个连通分量。

  1. #include <iostream>
  2. #include<stdio.h>
  3. #define maxn 1001
  4. using namespace std;
  5. int G[maxn][maxn]={0};
  6. int temp[maxn][maxn]={0};
  7. bool visited[maxn]={false};
  8. int N,M,K;
  9. void dfs(int index){
  10. visited[index] = true;
  11. for(int i=1;i<=N;i++){
  12. if(visited[i]==false&&temp[index][i]==1){
  13. dfs(i);
  14. }
  15. }
  16. }
  17. int check(int city){
  18. for(int i=1;i<=N;i++){
  19. visited[i] = false;
  20. for(int j=1;j<=N;j++){
  21. temp[i][j] = G[i][j];
  22. }
  23. }
  24. for(int i=1;i<=N;i++){
  25. temp[i][city] =temp[city][i] = 0;
  26. }
  27. int turn = 0;
  28. visited[city] = true;
  29. for(int i=1;i<=N;i++){
  30. if(visited[i]==false){
  31. turn++;
  32. dfs(i);
  33. }
  34. }
  35. return turn;
  36. }
  37. int main()
  38. {
  39. scanf("%d%d%d",&N,&M,&K);
  40. for(int i=0;i<M;i++){
  41. int v1,v2;
  42. scanf("%d%d",&v1,&v2);
  43. G[v1][v2] = G[v2][v1] = 1;
  44. }
  45. for(int i=0;i<K;i++){
  46. int check_city;
  47. scanf("%d",&check_city);
  48. printf("%d\n",check(check_city)-1);
  49. }
  50. return 0;
  51. }

发表评论

表情:
评论列表 (有 0 条评论,108人围观)

还没有评论,来说两句吧...

相关阅读