1. 程式人生 > >資料結構 鄰接矩陣儲存圖的深度優先遍歷

資料結構 鄰接矩陣儲存圖的深度優先遍歷

練習6.1 鄰接矩陣儲存圖的深度優先遍歷 (20 point(s))

試實現鄰接矩陣儲存圖的深度優先遍歷。

函式介面定義:

void DFS( MGraph Graph, Vertex V, void (*Visit)(Vertex) );

其中MGraph是鄰接矩陣儲存的圖,定義如下:

typedef struct GNode *PtrToGNode;
struct GNode{
    int Nv;  /* 頂點數 */
    int Ne;  /* 邊數   */
    WeightType G[MaxVertexNum][MaxVertexNum]; /* 鄰接矩陣 */
};
typedef PtrToGNode MGraph; /* 以鄰接矩陣儲存的圖型別 */

函式DFS應從第V個頂點出發遞迴地深度優先遍歷圖Graph,遍歷時用裁判定義的函式Visit訪問每個頂點。當訪問鄰接點時,要求按序號遞增的順序。題目保證V是圖中的合法頂點。

裁判測試程式樣例:

#include <stdio.h>

typedef enum {false, true} bool;
#define MaxVertexNum 10  /* 最大頂點數設為10 */
#define INFINITY 65535   /* ∞設為雙位元組無符號整數的最大值65535*/
typedef int Vertex;      /* 用頂點下標表示頂點,為整型 */
typedef int WeightType;  /* 邊的權值設為整型 */

typedef struct GNode *PtrToGNode;
struct GNode{
    int Nv;  /* 頂點數 */
    int Ne;  /* 邊數   */
    WeightType G[MaxVertexNum][MaxVertexNum]; /* 鄰接矩陣 */
};
typedef PtrToGNode MGraph; /* 以鄰接矩陣儲存的圖型別 */
bool Visited[MaxVertexNum]; /* 頂點的訪問標記 */

MGraph CreateGraph(); /* 建立圖並且將Visited初始化為false;裁判實現,細節不表 */

void Visit( Vertex V )
{
    printf(" %d", V);
}

void DFS( MGraph Graph, Vertex V, void (*Visit)(Vertex) );


int main()
{
    MGraph G;
    Vertex V;

    G = CreateGraph();
    scanf("%d", &V);
    printf("DFS from %d:", V);
    DFS(G, V, Visit);

    return 0;
}

/* 你的程式碼將被嵌在這裡 */

輸入樣例:給定圖如下

5

輸出樣例:

DFS from 5: 5 1 3 0 2 4 6

 標準的深度優先搜尋演算法

#include <stdio.h>

//typedef enum { false, true } bool;
#define MaxVertexNum 10  /* 最大頂點數設為10 */
#define INFINITY 65535   /* ∞設為雙位元組無符號整數的最大值65535*/
typedef int Vertex;      /* 用頂點下標表示頂點,為整型 */
typedef int WeightType;  /* 邊的權值設為整型 */

typedef struct GNode *PtrToGNode;
struct GNode {
	int Nv;  /* 頂點數 */
	int Ne;  /* 邊數   */
	WeightType G[MaxVertexNum][MaxVertexNum]; /* 鄰接矩陣 */
};
typedef PtrToGNode MGraph; /* 以鄰接矩陣儲存的圖型別 */
bool Visited[MaxVertexNum]; /* 頂點的訪問標記 */

MGraph CreateGraph(); /* 建立圖並且將Visited初始化為false;裁判實現,細節不表 */

void Visit(Vertex V)
{
	printf(" %d", V);
}

void DFS(MGraph Graph, Vertex V, void(*Visit)(Vertex));


int main()
{
	MGraph G;
	Vertex V;

	G = CreateGraph();
	scanf("%d", &V);
	printf("DFS from %d:", V);
	DFS(G, V, Visit);

	return 0;
}

/* 你的程式碼將被嵌在這裡 */

void DFS(MGraph Graph, Vertex V, void(*Visit)(Vertex))
{
	Visited[V] = true;
	Visit(V);
	for (int i = 0; i < Graph->Nv; i++)
	{
		if (Graph->G[V][i] != INFINITY && Visited[i])
			DFS(Graph, i, Visit);
	}
		

}

相關推薦

資料結構 鄰接矩陣儲存深度優先

練習6.1 鄰接矩陣儲存圖的深度優先遍歷 (20 point(s)) 試實現鄰接矩陣儲存圖的深度優先遍歷。 函式介面定義: void DFS( MGraph Graph, Vertex V, void (*Visit)(Vertex) ); 其中MGraph是鄰

資料結構 鄰接矩陣儲存深度優先

練習6.1 鄰接矩陣儲存圖的深度優先遍歷 (20 point(s)) 試實現鄰接矩陣儲存圖的深度優先遍歷。 函式介面定義: void DFS( MGraph Graph, Vertex V, void (*Visit)(Vertex) ); 其中MGraph是鄰接矩

小朋友學資料結構(16):基於鄰接矩陣的的深度優先和廣度優先

觀察下面兩個無向圖: 這兩個圖其實是一樣的,只是畫法不同罷了。第一張圖更有立體感,第二張圖更有層次感,並且把A點置為頂點(事實上圖的任何一點都可以做為頂點)。 一、用陣列來存放頂點 vexs[0] = ‘A’ vexs[1] = ‘B’ vexs[2] = ‘C’ ve

java 鄰接矩陣表示,深度優先,廣度優先

1 . 建立圖的鄰接矩陣資料結構 public class MGraph { /*圖的鄰接矩陣表示*/ int vexs; //圖中結點數目 char data[]; //存放結點資料 int [][]weight; /

鄰接矩陣實現的深度優先和廣度優先

using ++ while ext empty type push mat ron 1 #include <stdio.h> 2 #include <stdlib.h> 3 #include <queue> 4

資料結構實踐——迷宮問題之深度優先解法

【專案 - 迷宮問題之圖深度優先遍歷解法】   設計一個程式,採用深度優先遍歷演算法的思路,解決迷宮問題。   (1)建立迷宮對應的圖資料結構,並建立其鄰接表表示。   (2)採用深度優先遍歷的思路設計演算法,輸出從入口(1,1)點到出口(M,N

無向-鄰接連結串列的深度優先-DFS

一、DFS思想本演算法以無向網為例,儲存方式採用鄰接連結串列1)將該網以鄰接連結串列的方式儲存2)選取A點為起始點,訪問此頂點,用一個visit的bool型陣列記錄訪問狀態(false表示未被訪問,true表示已訪問)3)從A的未被訪問的鄰接點出發,深度優先遍歷圖,直到圖中所

深度優先的非遞迴實現

 採用非遞迴方法實現圖的深度優先遍歷 // // GraphDFSNonRecursion.c // // // Created by yanbinbin // #include <stdio.h> #include <stdlib.h>

深度優先 廣度優先 非遞迴 圖解演算法過程

圖的鄰接矩陣表示 通常圖的表示有兩種方法:鄰接矩陣,鄰接表。 本文用鄰接矩陣實現,一是程式碼量更少,二是程式碼風格也更貼近C語言。但不論是圖的哪種實現方式,其基本的實現思想是不變的。 1:節點的資訊,我們用一維陣列a[n]來儲存,假設圖共有n個節點。 2:節點與節點間的關係

無向 深度優先 c語言實現

無向圖的深度優先遍歷的實現,無向圖用鄰接表表示無向圖的表示:鄰接矩陣和鄰接表。 程式使用的示例圖為: 實現要點: 每個節點有三種狀態: -1,還未發現 0,已經發現了,正在處理,還沒有處理

迷宮問題之深度優先解法

*Copyright (c)2017,煙臺大學計算機與控制工程學院 *All rights reserved. *檔名稱: *作 者:李佳駿

關於鄰接表和其深度優先、廣度優先的問題

如果有一個鄰接表儲存的圖,以0點出發,深度優先遍歷和廣度優先遍歷。 鄰接表為: [0]->[1]->[5]->[6]->END [1]->[0]->[2]->END [2]->[1]->[3]->END [3]-&

資料結構——PTA 鄰接矩陣儲存深度優先鄰接儲存的廣度優先

廣度優先與深度優先是遍歷圖的兩種基本方法,大致的思想是DFS為遞迴,而BFS是佇列。 這裡給出PTA兩道題目的答案,方法很基本,但第三個形參還是第一次見,去網上搜了搜給出的說法是呼叫函式的地址,但個人感覺就是呼叫這個函式。。。 下面給出兩段程式碼 void BFS ( LGraph

C語言實現鄰接矩陣儲存結構深度優先和廣度優先

DFS的核心思想在於對訪問的鄰接節點進行遞迴呼叫;BFS的核心思想在於建立了一個鄰接節點的佇列。 在Dev C++中除錯執行通過。 用下圖進行了測試。 #include <stdio.h> #define MaxVertexNum 50 #defin

資料結構與演算法(Java描述)-20、鄰接矩陣、有向的廣度優先深度優先

一、圖的基本概念圖:是由結點集合及結點間的關係集合組成的一種資料結構。結點和邊:圖中的頂點稱作結點,圖中的第i個結點記做vi。有向圖: 在有向圖中,結點對<x ,y>是有序的,結點對<x,y>稱為從結點x到結點y的一條有向邊,因此,<x,y>與<y,x>是兩條不同的邊。有向圖

6-1 鄰接矩陣儲存深度優先 (20 分)

試實現鄰接矩陣儲存圖的深度優先遍歷。 函式介面定義: void DFS( MGraph Graph, Vertex V, void (*Visit)(Vertex) ); 其中MGraph是鄰接矩陣儲存的圖,定義如下: typedef struct GNode *PtrToG

6-1 鄰接矩陣儲存深度優先 (20 分) 第七章----基本概念-計算機17級

6-1 鄰接矩陣儲存圖的深度優先遍歷 (20 分) 試實現鄰接矩陣儲存圖的深度優先遍歷。 函式介面定義: void DFS( MGraph Graph, Vertex V, void (*Visit)(Vertex) ); 其中MGraph是鄰接矩陣儲存的圖

資料結構 優先鄰接矩陣

資料結構 #include <iostream> using namespace std; #define maxsizes 105 typedef int Type; // 頂點定義 typedef struct{ Ty

1-7 鄰接矩陣儲存深度優先 (10 分)

試實現鄰接矩陣儲存圖的深度優先遍歷。 函式介面定義: void DFS( MGraph Graph, Vertex V, void (*Visit)(Vertex) ); 其中MGraph是鄰接矩陣儲存的圖,定義如下: typedef struct GNode *PtrToGNod

資料結構---鄰接表(建立、列印、深度優先,廣度優先C語言)

當一個圖為稀疏圖時,使用鄰接矩陣會浪費大量儲存空間。 鄰接表法結合了順序儲存和鏈式儲存方法,減少了不必要的浪費。 鄰接表 1)對圖G的每個頂點vi建立一個單鏈表,第i個單鏈表中的結點表示依附於頂點vi的邊(對於有向圖則是以頂點vi為尾的弧)。這個單鏈表就稱為頂點vi