[关闭]
@laofang 2016-06-30T04:42:52.000000Z 字数 1366 阅读 1783

无向图的连通分支---DFS

java


Description
输入一个无向图G,计算G的连通分支数。=
Input
有多个无向图数据。每个无向描述的第1行是两个整数n和e,分别表示顶点数和边数。接着有e行,每行有2个整数a、b,分别是一条边的两个端点(起点和终点)。两个图之间空一行。
Output
对每个无向图,输出图中连通分支个数。
Sample Input
2 1
1 2

5 8
1 2
1 3
1 4
1 5
2 3
2 4
3 4
4 5
Sample Output
1
1

java版本:

  1. import java.util.*;
  2. public class Main {
  3. public static boolean [] vis = new boolean[1000];
  4. public static ArrayList<Integer> [] list= new ArrayList[1000];
  5. public static void main(String[] args) {
  6. Scanner scanner = new Scanner(System.in);
  7. while (scanner.hasNext()){
  8. int n = scanner.nextInt();
  9. int e = scanner.nextInt();
  10. for(int i=0; i<1000;i++){
  11. vis[i] = false;
  12. list[i] = new ArrayList<>();
  13. }
  14. for(int i=0; i<e; i++){
  15. int st = scanner.nextInt();
  16. int ed = scanner.nextInt();
  17. st--;ed--;
  18. list[st].add(ed);
  19. list[ed].add(st);
  20. }
  21. int count = 0;
  22. for(int i=0;i<n;i++){
  23. if(vis[i] == false) {
  24. dfs(i);
  25. count++;
  26. }
  27. }
  28. System.out.println(count);
  29. }
  30. }
  31. public static void dfs(int i){
  32. for(int ele = 0; ele<list[i].size(); ele++){
  33. if(vis[list[i].get(ele)] == false){
  34. vis[list[i].get(ele)] = true;
  35. dfs(list[i].get(ele));
  36. }
  37. }
  38. }
  39. }

C++版本:

  1. #include<iostream>
  2. #include<math.h>
  3. #include<vector>
  4. #include<memory.h>
  5. using namespace std;
  6. #define N 1000
  7. vector<int> G[N];
  8. bool vis[N];
  9. void dfs(int i){
  10. for(const int &j : G[i]){
  11. if(!vis[j]){
  12. vis[j] = true;
  13. dfs(j);
  14. }
  15. }
  16. }
  17. int main(){
  18. int n,e;
  19. while(cin >> n >> e){
  20. memset(vis,0,sizeof(vis));
  21. for(int i=0; i<N;i++)
  22. G[i].clear();
  23. while(e--){
  24. int st,ed;
  25. cin >> st >> ed;
  26. st--;
  27. ed--;
  28. G[st].push_back(ed);
  29. G[ed].push_back(st);
  30. }
  31. int count = 0;
  32. for(int i=0; i<n; i++){
  33. if(!vis[i]){
  34. dfs(i);
  35. count++;
  36. }
  37. }
  38. cout << count << endl;
  39. }
  40. }
添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注