1. 程式人生 > >圖的鄰接矩陣遍歷

圖的鄰接矩陣遍歷

這裡寫圖片描述

深度遍歷:第一次: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到