算法 第四版 图论 基于深度优先搜索来解决图连通性(C++)
1 #include <iostream>
2 #include <stack>
3 #include <forward_list>
4 #include <vector>
5 #include <iterator>
6
7 #define MAX_S 100
8 using namespace std;
9
10 class Graph{
11 int v;
12 int e;
13 vector<forward_list<int>> adjt;
14
15 public:
16 //两个构造函数
17 Graph(int V ): v(V){
18 e = 0;
19 vector<forward_list<int>> adjt1(MAX_S);
20 adjt = adjt1;
21 }
22
23 Graph(int V,int E): v(V), e(E)
24 {
25 vector<forward_list<int>> adjt1(MAX_S);
26 adjt = adjt1;
27
28 for (int i = 0; i < e; ++i)
29 {
30 int v, w;
31 cin >> v >> w;
32 addEdge(v,w);
33 }
34 }
35 int V(){
36 return v;
37 }
38 int E(){
39 return e;
40 }
41 //加入新边
42 void addEdge(int v, int w)
43 {
44 adjt[v].push_front(w);
45 adjt[w].push_front(v);
46 }
47 //给定顶点的邻接顶点
48 forward_list<int> adj(int v)
49 {
50 return adjt[v];
51 }
52 //计算v的度
53 };
54
55 class CC
56 {
57 vector<bool> marked;
58 //连通分量标识符
59 vector<int> id;
60 int count;
61
62 public:
63 //预处理构造函数,for循环会查找每个未被标记的顶点并递归标记与之想连通的顶点
64 CC(Graph G){
65 vector<bool> marked1(MAX_S);
66 vector<int> id1(MAX_S);
67
68 marked = marked1;
69 id = id1;
70 count = 0;
71
72 for (int i = 0; i < G.V(); ++i)
73 {
74 if (!marked[i])
75 {
76 dfs(G, i);
77 count++;
78 }
79 }
80 }
81
82 void dfs(Graph G, int i)
83 {
84 marked[i] = true;
85 for (auto &c : G.adj(i))
86 if (!marked[c])
87 dfs(G, c);
88 id[i] = count;
89 }
90 //v和w连通吗
91 bool connected(int v, int w)
92 {
93 return id[v] == id[w];
94 }
95 //v所在的连通分量的标识符
96 int Id(int v)
97 {
98 return id[v];
99 }
100 //连通分量数
101 int Count()
102 {
103 return count;
104 }
105
106
107 };
108
109 //查找所有的连通分量
110 int main()
111 {
112 int v, e;
113 cout << "Please enter two integer to vertices and edges: " ;
114 cin >> v >> e;
115 Graph G(v, e);
116
117 CC conComp(G);
118
119 cout << conComp.Count() << "components" << endl;
120
121 for (int i =0; i < conComp.Count(); ++i)
122 {
123 for (int j = 0; j < G.V(); ++j)
124 {
125 if (conComp.Id(j) ==i)
126 cout << j << ' ';
127 }
128 cout << endl;
129 }
130
131 }
132