圖的鄰接矩陣遍歷
深度遍歷:第一次:A->F->G->H 發現 結點 6 訪問過了指標移動
第二次:訪問 結點4(E) ->D->I->C->B
廣度遍歷:注重次序
第一次:A 入佇列 訪問A A出佇列,將 A 的所有未被訪問的鄰接點按照次序入佇列 (F)(B) 入隊
第二次:訪問 F F出佇列,將 F 所有的鄰接點按照次序入佇列
第三次:訪問 B B出佇列,將 B 所有的鄰接點按照次序入佇列
#include <iostream>
using namespace std;
/**
這裡通過鄰接矩陣來構建鄰接表
**/
#define OK 1
#define ERROR 0
#define TRUE 1
#define FALSE 0
#define MAXVEX 100
#define MAXSIZE 9 /* 儲存空間初始分配量 */
typedef int Status;
typedef char VertexType;
typedef int EdgeType; // 權值
// 鄰接矩陣結構
typedef struct{
VertexType vex[MAXVEX]; // 頂點表
EdgeType arc[MAXVEX][MAXVEX]; //鄰接矩陣 邊表
int numEdges = 15 ;
int numVertexes = 9;
}MGraph;
// 邊表節點
typedef struct EdgeNode{
int adjvex; // 儲存該頂點對應的下標
EdgeType info;
struct EdgeNode * next;
}EdgeNode;
// 頂點節點
typedef struct VertexNode{
// 統計每個頂點的入度
int in;
VertexType data;
EdgeNode * firstedge; // 第一個指向邊表的指標
}VertexNode,AdjList[MAXVEX];
// 圖的鄰接表結構
typedef struct {
AdjList adjList;
int numNodes,numEdges;
}GraphAdjList,*GraphAdjListLink; // 定義鄰接表的指標
/**********************/
/**
定義用到的資料結構佇列
使用的是迴圈佇列 (判斷佇列滿的方法為差一個位置)
**/
typedef struct {
int data[MAXSIZE]; //用來存放被訪問的結點
int front;
int rear;
}Queue;
Status InitQueue(Queue * q){
q->front = 0;
q->rear = 0;
return OK;
}
Status QueueEmpty(Queue q){
if(q.front == q.rear)
return TRUE;
else
return FALSE;
}
Status DeQueue(Queue *q,int *e){
// 佇列空的條件判斷
if(q->front == q->rear)
return ERROR;
*e=q->data[q->front];
q->front = (q->front+1)%MAXSIZE;
return OK;
}
Status EnQueue(Queue * Q, int e){
// 佇列滿的條件
if((Q->rear+1)%MAXSIZE == Q->front)
return ERROR;
Q->data[Q->rear] = e;
Q->rear = (Q->rear+1)%MAXSIZE;
return OK;
}
/************************/
/************************/
/**
使用鄰接矩陣的構建圖
**/
void CreateMGraph(MGraph *G){
int i , j;
G->numEdges = 15;
G->numVertexes = 9;
// 輸入頂點的結點
G->vex[0] = 'A';
G->vex[1] = 'B';
G->vex[2] = 'C';
G->vex[3] = 'D';
G->vex[4] = 'E';
G->vex[5] = 'F';
G->vex[6] = 'G';
G->vex[7] = 'H';
G->vex[8] = 'I';
// 鄰接矩陣初始化
for(i = 0; i < G->numVertexes; i++ ){
for (j = 0; j < G->numVertexes; j++) {
G->arc[i][j] = 0;
}
}
// 隨機生成圖
G->arc[0][1] = 1;
G->arc[0][5] = 1;
G->arc[1][2] = 1;
G->arc[1][8] = 1;
G->arc[1][6] = 1;
G->arc[2][3] = 1;
G->arc[2][8] = 1;
G->arc[3][4] = 1;
G->arc[3][7] = 1;
G->arc[3][6] = 1;
G->arc[3][8] = 1;
G->arc[4][5] = 1;
G->arc[4][7] = 1;
G->arc[5][6] = 1;
G->arc[6][7] = 1;
//因為構建的是無向圖,
for(i = 0; i < G->numVertexes; i++){
for( j = i; j < G->numVertexes; j++)
G->arc[j][i] = G->arc[i][j];
}
}
// 使用鄰接矩陣構建鄰接連結串列
void CreateALGraph(MGraph G, GraphAdjListLink * GL){
int i , j;
EdgeNode * e;
*GL = (GraphAdjListLink)malloc(sizeof(GraphAdjList));
(*GL)->numEdges = G.numEdges;
(*GL)->numNodes = G.numVertexes;
// 生成頂點表
for(i= 0;i <G.numVertexes;i++) /* 讀入頂點資訊,建立頂點表 */
{
(*GL)->adjList[i].in=0;
(*GL)->adjList[i].data=G.vex[i];
(*GL)->adjList[i].firstedge=NULL; /* 將邊表置為空表 */
}
// 生成鄰接表
for(i = 0; i < G.numVertexes; i++){
for (j = 0; j < G.numVertexes; j++) {
if(G.arc[i][j] == 1){
e = (EdgeNode * )malloc(sizeof(EdgeNode));
e->adjvex = j;
e->next = (*GL)->adjList[i].firstedge;
(*GL)->adjList[i].firstedge = e;
(*GL)->adjList[j].in ++ ; // 頂點入度加1
}
}
}
}
/*********************/
/**********************/
/** 深度優先相關 遍歷所有結點**/
/** 過程:
1. 依次遍歷頂點表的每個頂點,防止非連通圖的出現
2. 如果該頂點沒有訪問,則訪問該頂點,
3. 找到與該頂點相連的第一個臨界點,進行遞迴,結束條件是 p 的臨界點為空
4. 繼續從第一個頂點的第二個鄰接點進行遍歷
**/
bool visited[MAXSIZE];
void DFS(GraphAdjListLink GL,int pos){
EdgeNode *p;
visited[pos] = true;
cout<<GL->adjList[pos].data<<endl;
p = GL->adjList[pos].firstedge;
while (p) {
if(!visited[p->adjvex])
DFS(GL, p->adjvex);
p = p->next;
}
}
void DFSTraverse(GraphAdjListLink GL){
int i;
for(i = 0; i < (GL)->numEdges; i++)
visited[i] = FALSE;
for (i = 0; i < GL->numNodes; i++) {
if(visited[i] == FALSE){
DFS(GL,i);
}
}
}
/**********************/
// 鄰接表的廣度遍歷演算法
/** 過程:1. 依次從頂點表開始遍歷 防止非連通圖的出現
2. 判斷結點有沒有被訪問
3. 沒有被訪問則進入佇列
4. 判斷佇列是否為空,如果不為空,出佇列,並且將與頂點直接相連的所有臨近點按照順序入佇列
5. 重複 1 - 4 的過程
**/
void BFSTraverse(GraphAdjListLink GL){
int i;
EdgeNode *p;
Queue Q;
for(i =0; i < GL->numNodes; i++)
visited[i] = FALSE;
InitQueue(&Q);
for(i = 0; i < GL->numNodes; i++){
if(!visited[i]){
visited[i] = true;
cout<<GL->adjList[i].data<<endl;
EnQueue(&Q, i);
while (!QueueEmpty(Q)) {
DeQueue(&Q, &i);
p = GL->adjList[i].firstedge;
while (p) {
if(!visited[p->adjvex]){
visited[p->adjvex] = true;
cout<<GL->adjList[p->adjvex].data<<endl;
EnQueue(&Q, p->adjvex);
}
p = p->next;
}
}
}
}
}
int main(int argc, const char * argv[]) {
MGraph G;
GraphAdjListLink GL;
CreateMGraph(&G);
CreateALGraph(G,&GL);
printf("\n深度遍歷:");
DFSTraverse(GL);
printf("\n廣度遍歷:");
BFSTraverse(GL);
return 0;
return 0;
}
相關推薦
圖的鄰接矩陣遍歷
深度遍歷:第一次:A->F->G->H 發現 結點 6 訪問過了指標移動 第二次:訪問 結點4(E) ->D->I->C->B 廣度遍歷:注重次序
圖 ADT介面 遍歷運算 常規運算 鄰接矩陣實現
Graph.h (圖的結構, 遍歷, 常規操作介面) 1 /*定義圖的最大定點數, 它要大於等於具體圖的頂點樹n*/ 2 #define MaxVertexNum 12 3 4 /*定義圖的最大邊數,它要大於等於具體圖的邊數e*/ 5 #define MaxEdgeNum 2
資料結構 圖的優先遍歷(鄰接矩陣)
資料結構 #include <iostream> using namespace std; #define maxsizes 105 typedef int Type; // 頂點定義 typedef struct{ Ty
無向圖-鄰接矩陣-寬度優先遍歷-BFS C程式碼實現
一、BFS演算法思路本演算法以無向圖為例,儲存方式採用鄰接矩陣1)將該網以鄰接矩陣的方式儲存,由於這裡的示例採用無向圖,因此它是一個對稱陣2)選取A點為起始點,訪問此頂點,用一個visit的bool型陣列記錄訪問狀態(false表示未被訪問,true表示已訪問)3)從A的未被
棧實現的圖鄰接矩陣深度優先遍歷
#include <stdio.h> #define N 6 // 深度優先遍歷 void DFS_Traverse(bool adjmatrix[][N], int v0, void (*f)(int)) { bool visited[N] = {true};// v0設為已訪問 int
圖---鄰接矩陣 建立,深度遍歷,廣度遍歷
fin n) init html fst true 函數調用 ear over 圖的存儲方式可以用鄰接矩陣來表示,我們假定頂點序號從0開始,即圖G的頂點集的一般形式是V(G)={v0 ,vi ,…,Vn-1 }。 以下代碼測試過,為圖的鄰接矩陣表
圖(圖的建立鄰接連結串列法)(圖的深度遍歷搜尋)
#include <stdio.h> #include <stdlib.h> #define MAXSIZE 100 int visited[MAXSIZE]={0}; typedef struct node { int adjvex; struct node* ne
6-15 圖的深度遍歷-鄰接表實現
圖的深度遍歷-鄰接表實現 (10 分) 本題要求實現鄰接表儲存圖的深度優先遍歷。 函式介面定義: void DFS(ALGraph *G,int i); 其中ALGraph是鄰接表儲存的圖,定義如下: #define MAX_VERTEX_NUM 10
圖的深度遍歷-鄰接連結串列表示
#include<stdio.h> #include<malloc.h> #define N 1005 typedef struct Link{ int data; str
圖的廣度遍歷和深度遍歷
初始化 -- fin num 方法 技術分享 else 全部 nts /* 圖的遍歷方法主要有兩種:一種是深度優先遍歷。一種是廣度優先遍歷。圖的深度優先遍歷類同於樹的先根遍歷。圖的廣度遍歷類同樹的層次遍歷 一:連通圖的深度優先遍歷算法 圖的深度優先遍歷算法是遍歷
無向圖廣度優先遍歷及其matlab實現
margin cte align style -- als 矩陣 ffffff bre 廣度優先遍歷(breadth-first traverse,bfts),稱作廣度優先搜索(breath first search)是連通圖的一種遍歷策略。之所以稱作廣度優先遍歷是因為
無向圖廣度優先遍歷及其JAVA實現
isp all 表示 -- 排列 優先 bre image 完成 廣度優先遍歷(breadth-first traverse,bfts),稱作廣度優先搜索(breath first search)是連通圖的一種遍歷策略。之所以稱作廣度優先遍歷是因為他的思想是從一個頂點V0開
圖像的遍歷
操作 通信 tin [1] down tel 有效 images idt 我們在實際應用中對圖像進行的操作,往往並不是將圖像作為一個整體進行操作,而是對圖像中的所有點或特殊點進行運算,所以遍歷圖像就顯得很重要,如何高效的遍歷圖像是一個很值得探討的問題。 一、遍歷圖像的4種方
圖 - 廣度優先遍歷
希望 padding borde i++ arc UC 結點 深度優先 nowrap 圖的遍歷和樹的遍歷類似,我們希望從圖中某一頂點出發訪遍圖中其余頂點,且使每一個頂點僅被訪問一次,這一過程就叫做圖的遍歷(Traverse Graph)。 圖的遍歷方法一般有兩種,第一種是我
Luogu 3758 [TJOI2017]可樂(有向圖鄰接矩陣冪的意義 矩陣快速冪)
urn font 出了 family 意義 strong 答案 題目 str 題目描述 加裏敦星球的人們特別喜歡喝可樂。因而,他們的敵對星球研發出了一個可樂機器人,並且放在了加裏敦星球的1號城市上。這個可樂機器人有三種行為: 停在原地,去下一個相鄰的城市,自爆。它每一秒都
整形圖的深度遍歷和廣度遍歷
比較簡單的實現,圖採用鄰接矩陣的儲存方式,且沒有加上覆制建構函式和過載運算子。 #include <iostream> #include<stdexcept> #include<stdio.h> using namespace std; struc
有向圖鄰接矩陣深度優先搜尋
上一個文章是寫的無向圖和鄰接連結串列的廣度搜索,深度搜索就用矩陣和有向圖了。 矩陣處理起來還是會比連結串列簡單一些。 先分析資料結構: 1.儲存所有結點的集合用到了一個單向迴圈連結串列,為什麼要用迴圈連結串列呢,因為在儲存結點資料的時候是按照輸入資料的順序來儲存的,如果是用一個數組或者單
資料結構實驗之圖論二:圖的深度遍歷(SDUT 2107)(簡單DFS)
題解:圖的深度遍歷就是順著一個最初的結點開始,把與它相鄰的結點都找到,也就是一直往下搜尋直到盡頭,然後在順次找其他的結點。 #include <bits/stdc++.h> using namespace std; int gra[200][200]; //儲存圖的大小 int
C++資料結構 21 圖-鄰接矩陣
#include <iostream> #define MAX_VERTS 20 using namespace std; /**使用鄰接矩陣來表示一個圖**/ class Vertex { public: Vertex(char lab){Label=lab;}
SDUT-2107_圖的深度遍歷
amp code 數據 pre == time 深度優先搜索 scan n-1 數據結構實驗之圖論二:圖的深度遍歷 Time Limit: 1000 ms Memory Limit: 65536 KiB Problem Description 請定一個無向圖,頂點編號從0到