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 }