6)图[1]之邻接矩阵存储[深度遍历和广度遍历]

  1 #include "iostream"
  2 #include "queue"
  3 using namespace std;
  4 
  5 const int MaxNumVertex  = 100; //最大顶点数
  6 typedef int elementtype;       //elementtype 为int 型
  7 class graph{
  8 public:
  9     graph();
 10     ~graph();
 11     elementtype insertvertex(elementtype v); //在图中增加一个顶点
 12     elementtype deletevertex(elementtype v); //在图中删除一个顶点
 13     elementtype insertedge(elementtype v,elementtype u);//在图中增加一条从v顶点到u顶点的弧
 14     elementtype deleteedge(elementtype v,elementtype u);//]在图中删除一条从v顶点到u顶点的弧
 15     elementtype dfs(elementtype v);//从v顶点出发进行深度优先遍历
 16     elementtype bfs(elementtype v);//从v顶点出发进行广度优先遍历
 17     elementtype travel_dfs();//深度优先遍历图
 18     elementtype travel_bfs();//广度优先遍历图
 19     elementtype locatevertex(elementtype v);//求顶点v在图g中的位序
 20     elementtype firstadj(elementtype v);//求图g中顶点v的第一个邻接点
 21     elementtype nextadj(elementtype v,elementtype m);//求图中顶点v的m邻接点之后的邻接点
 22     elementtype degree(elementtype v);//求图中顶点v的度数
 23 private:
 24     elementtype vertex[MaxNumVertex];//顶点表
 25     elementtype edge[MaxNumVertex][MaxNumVertex];//图中弧的类型
 26     int  CurrentVertex;//当前顶点数
 27     bool visited[MaxNumVertex];//顶点是否被访问
 28 };
 29 
 30 /*
 31 *初始化
 32 */
 33 graph::graph()
 34 {
 35     CurrentVertex = 0; 
 36     int i,j;
 37     for (i=MaxNumVertex-1;i>=1;i--)
 38     {
 39         for (j=MaxNumVertex-1;j>=1;j--)
 40         {
 41             edge[i][j] = 0;
 42 
 43         }
 44     }
 45     for (i=MaxNumVertex-1;i>=1;i--)
 46     {
 47         visited[i] = false;
 48     }
 49 }
 50 
 51 
 52 /*
 53 *在图中增加一个顶点
 54 */
 55 elementtype graph::insertvertex(elementtype v)
 56 {
 57     //判断这个顶点是否已经存在
 58     int i;
 59     bool flags = true;
 60     for(i=1; i<=CurrentVertex; i++)
 61     {
 62         if(vertex[i]==v)
 63         {
 64             flags = false;
 65             break;
 66         }
 67     }
 68     
 69     if(flags)
 70     {
 71         CurrentVertex++;
 72         vertex[CurrentVertex] = v;
 73     }else{
 74         cout<<v<<"顶点已经存在!"<<endl;
 75     }
 76     return 0;
 77 }
 78 
 79 /*
 80 *在图中删除一个顶点
 81 */
 82 elementtype graph::deletevertex(elementtype v)
 83 {
 84     int i,j;
 85     bool flags = true;
 86     for(i=1; i<=CurrentVertex; i++)
 87     {
 88         if(vertex[i]==v)
 89         {
 90             flags = false;
 91             j=i;
 92             while(j<CurrentVertex)
 93             {
 94                 vertex[j] = vertex[j+1];
 95                 j++;
 96             }
 97             
 98             CurrentVertex--;
 99         }
100 
101     }
102     if(flags) cout<<v<<"顶点不存在!";
103     return 0;
104 }
105 
106 /*
107 *在图中增加一条从v顶点到u顶点的弧
108 */
109 elementtype graph::insertedge(elementtype v,elementtype u)
110 {
111     if(edge[v][u]!=0)
112     {
113         cout<<v<<"->"<<u<<"这条弧弧已经存在!"<<endl;
114     }else{
115         edge[v][u] = 1;
116     }
117     return 0;
118 }
119 
120 /*
121 *在图中删除一条从v顶点到u顶点的额弧
122 */
123 elementtype graph::deleteedge(elementtype v,elementtype u)
124 {
125     if(edge[v][u]!=0)
126     {
127         edge[v][u] = 0;
128     }else {
129         cout<<v<<"->"<<u<<"这条弧不存在!"<<endl;
130     }
131     return 0;
132 }
133 
134 /*
135 *顶点v在图中的位序()???
136 */
137 elementtype graph::locatevertex(elementtype v)
138 {
139     int i,locate=0;
140     for(i=1;i<=CurrentVertex; i++)
141     {
142         if(vertex[i]==v)
143         {
144             locate = i;
145             break;
146         }
147     }
148     return locate;
149 }
150 
151 /*
152 *求图中顶点v的第一个邻接点
153 */
154 elementtype graph::firstadj(elementtype v)
155 {
156     int u,i;
157     bool flags = true;//用于判断是否存在邻接点
158     for(i=1;i<=CurrentVertex;i++)
159     {
160         if(edge[v][i]!=0){
161             u = i;
162             flags = false;
163             break;
164         }
165     }
166     if(flags) u = 0;//邻接点不存在
167     return u;
168 }
169 
170 /*
171 *求图中顶点v的m邻接点以后的邻接点
172 */
173 elementtype graph::nextadj(elementtype v,elementtype m)
174 {
175     int i,u;
176     bool flags = true;
177     for(i=m+1;i<=CurrentVertex;i++)
178     {
179         if(edge[v][i]!=0)
180         {
181             u = i;
182             flags = false;
183             break;
184         }
185     }
186     if(flags) u = 0;//邻接点不存在
187     return u;
188 }
189 
190 /*
191 *求图中顶点v的度数
192 */
193 elementtype graph::degree(elementtype v)
194 {
195     int i,num = 0;
196     for (i=MaxNumVertex-1;i>=1;i--)
197     {
198         if(edge[v][i]!=0 || edge[i][v]!=0)num++;
199     }
200     return num;
201 }
202 /*
203 *从v顶点出发进行深度优先遍历
204 */
205 elementtype graph::dfs(elementtype v)
206 {
207     int w;
208     cout<<v<<"->";
209     visited[v] = true;//访问顶点v,并设置其访问标志
210     w = firstadj(v);//求出v的第一个邻接点
211     while(w!=0)
212     {
213         if(visited[w]==false)//顶点w还没有被访问
214         {
215             dfs(w);
216         }
217         w = nextadj(v,w);
218     }
219     return 0;
220 }
221 
222 /*
223 *深度遍历整个图;保证访问到所有结点
224 */
225 elementtype graph::travel_dfs()
226 {
227     int i;
228     for(i=1;i<=CurrentVertex;i++)visited[i] = false;
229     for(i=1;i<=CurrentVertex;i++)
230     {
231         if(visited[i]==false) dfs(i);
232     }
233     return 0;
234 }
235 
236 /*
237 *广度有限遍历
238 */
239 elementtype graph::bfs(elementtype v0)
240 {
241     int w,x,v;
242     queue<elementtype>q;
243     visited[v0] = true;
244     cout<<v0<<"->";
245     q.push(v0);
246     while(!q.empty())
247     {
248         x=q.front();
249         v=x;
250         q.pop();
251         w=firstadj(v);
252         while(w!=0)
253         {
254             if(!visited[w])
255             {
256                 visited[w] = true;
257                 cout<<w<<"->";
258                 q.push(w);
259             }
260             w = nextadj(v,w);
261         }
262     }
263     return 0;
264 }
265 
266 /*
267 *广度优先遍历
268 */
269 elementtype graph::travel_bfs()
270 {
271     int i;
272     for(i=1;i<=CurrentVertex;i++)visited[i] = false;
273     for(i=1;i<=CurrentVertex;i++)
274     {
275         if(visited[i]==false) bfs(i);
276     }
277     return 0;
278 }
279 graph::~graph()
280 {
281 }
282 int main()
283 {
284     graph g;
285     int i,numv,v,u,w;
286     cout<<"请输入顶点数:";
287     cin>>numv;
288     cout<<"请依次输入顶点:";
289     for(i=1;i<=numv;i++)
290     {
291         cin>>v;
292         g.insertvertex(v);
293     }
294 
295     cout<<"请输入弧的数目:";
296     cin>>numv;
297     
298     for(i=1;i<=numv;i++)
299     {
300         cout<<"u->w:";
301         cin>>u>>w;
302         g.insertedge(u,w);
303     }
304 
305     cout<<"深度遍历结果dfs:";
306     g.travel_dfs();
307     cout<<endl;
308 
309     cout<<"广度遍历结果bfs:";
310     g.travel_bfs();
311     cout<<endl;
312     return 0;
313 }

 

原文地址:https://www.cnblogs.com/minmsy/p/4963367.html