算法 第四版 图论 基于深度优先搜索来解决图连通性(C++)

算法 第四版 图论 基于深度优先搜索来解决图连通性(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 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值