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

圖的鄰接矩陣及遍歷

/*****************************************************************************
DataStruct Of Graph
******************************************************************************/

#include <iostream>
#include <queue>
#include <stack>
using namespace std;
#include "stdafx.h"

const int MaxSize = 10;
template <class DataType>
class MGraph
{
private:
	int i,j,k;
	DataType vertex[MaxSize];
	int arc[MaxSize][MaxSize];
	int vertexNum,arcNum;
	int visited[MaxSize];
public:
	MGraph(DataType a[],int n,int e);
	~MGraph(){}
	void DFSTraverse(int v);
	void DFSN0Recursion(int v);
	void BFSTraverse(int v);
};
template <class DataType>
MGraph<DataType>::MGraph(DataType a[],int n,int e){
  vertexNum = n;arcNum = e;
  memset(visited,0,sizeof(visited));
  for(i=0;i<vertexNum;i++)
	  vertex[i]=a[i];
  for(i=0;i<vertexNum;i++)
	  for(j=0;j<vertexNum;j++)
		  arc[i][j]=0;
  for(k=0;k<arcNum;k++){
    cin>>i>>j;
	arc[i][j]=1;
	arc[j][i]=1;
  }
}

/////////////////////////////////////圖的鄰接矩陣深度遞迴遍歷////////////////////////////////////////////////

template <class DataType>
void MGraph<DataType>::DFSTraverse(int v){
 cout<<vertex[v];
 visited[v]=1;
 for(j=0;j<vertexNum;j++)
  if(arc[v][j]==1&&visited[j]==0)
	  DFSTraverse(j);
}

///////////////////////////////////////圖的鄰接矩陣深度非遞迴遍歷/////////////////////////////////////////////////
template <class DataType>
void MGraph<DataType>::DFSN0Recursion(int v){
	memset(visited,0,sizeof(visited));
	i=0;	
	stack<int> stack;
	cout<<vertex[v];
	visited[v]=1;
	stack.push(v);
	while(1){
	   while(i<=vertexNum){
			if(visited[i]==0&&arc[v][i]==1){
			  cout<<vertex[i];
			  stack.push(i);
			  visited[i]=1;
			  v=i;
			  i=0;
			}else{
			  i++;
			}
		}
	   stack.pop();
	   if(!stack.empty()){
		  v=stack.top();
	   }else{
	      return;
	   }
	}
}

///////////////////////////////////////////鄰接矩陣廣度非遞迴遍歷///////////////////////////////////
template <class DataType>
void MGraph<DataType>::BFSTraverse(int v){
   memset(visited,0,sizeof(visited));
   queue<int> queue;
   cout<<vertex[v];
   visited[v]=1;
   queue.push(v);
   while(1){
	   for(i=0;i<vertexNum;i++){
		   if(arc[v][i]==1&&visited[i]==0){
		      cout<<vertex[i];
			  queue.push(i);
			  visited[i]=1;
		   }
	   }
	   queue.pop();
	   if(!queue.empty()){
	     v = queue.front();
	   }else{
	     return;
	   }
   }
}
///////////////////Main.cpp///////////////
// MGraph.cpp : 定義控制檯應用程式的入口點。
//

#include "stdafx.h"
#include "GMraph.h"

int _tmain(int argc, _TCHAR* argv[])
{
	int a[]={1,2,3,4},n=4,e=2;
	MGraph<int> mgraph(a,n,e);
	mgraph.DFSTraverse(0);
	cout<<endl<<"-----------------------我是萬惡的分割線------------------"<<endl;
	mgraph.DFSN0Recursion(0);
	cout<<endl<<"-----------------------我是萬惡的分割線------------------"<<endl;
	mgraph.BFSTraverse(0);
	return 0;
}


相關推薦

鄰接矩陣

/***************************************************************************** DataStruct Of Graph **************************************

資料結構作業——的儲存鄰接矩陣鄰接表+DFS遞迴、非遞迴+BFS)

鄰接矩陣存圖 /* * @Author: WZY * @School: HPU * @Date: 2018-11-02 18:35:27 * @Last Modified by: WZY * @Last Modified time: 2018-11-0

的表示

1. 圖的表示 1)臨接矩陣 使用二維陣列arr[N][N]表示一個圖。 a. N 為圖的頂點個數,矩陣的對角線全為0。 b. 兩個頂點連通的話,矩陣的值為1 c. 某一行的和表示該頂點的出度。某一列的和表示該頂點的入度 d. 有權值的圖,矩陣元素不再是0,1表示是否連通,而是把元素值表示為權值。

廣度優先搜尋BFS 之的構造

1. 由給定的頂點和邊的資訊構造圖的鄰接矩陣儲存; 對該圖進行深度優先搜尋,輸出搜尋得到的結點序列; 3. 以鄰接表作儲存結構,用克魯斯卡爾演算法構造最小生成樹。 /* 5 6 abcde 0 1 10 0 3 20 1 2 30 1 4 40 2 3 50 2 4 6

鄰接矩陣——————資料結構作業

實現 鄰接矩陣存圖 DFS遞迴遍歷 DFS非遞迴遍歷 BFS遞迴遍歷 #include<cstdio> #include<cstring> #include<queue> #include<stack>

鄰接矩陣儲存

這裡採用圖的鄰接矩陣儲存(即為二維陣列) 遍歷:DFS和BFS #include<cstdio> #include<iostream> #include<cstring> #include<queue> using namespace s

鄰接連結串列存——————資料結構作業

實現 鄰接連結串列存圖 DFS遞迴遍歷 DFS非遞迴遍歷 BFS遞迴遍歷 #include<bits/stdc++.h> using namespace std; const int MAXN = 1e4; vector<int

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是鄰接矩陣儲存的圖

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

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

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

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

資料結構——的儲存與鄰接矩陣

圖的儲存與遍歷(鄰接矩陣) #include<stdio.h> #include<stdlib.h> #define MAXVEX 20 /*最大頂點個數*/ #define INFINITY 32767

的深度優先鄰接矩陣,遞迴,非遞迴)

參考部落格:圖的深度優先遍歷(遞迴、非遞迴;鄰接表,鄰接矩陣) 本篇預設連通圖,非連通情況會在鄰接表處補上   1.鄰接矩陣的遞迴解法 #include<stdio.h> #define MAX 100 typedef struct { int e[MAX][MA

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

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

C語言實現鄰接矩陣建立無向&的深度優先

/* '鄰接矩陣' 實現無向圖的建立、深度優先遍歷*/ #include <stdio.h> #include <stdlib.h> #define MaxVex 100 //最多頂點個數 #define INFINITY 32768

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

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

的廣度優先BFS(鄰接矩陣實現)c語言

廣度優先遍歷也叫廣度優先搜尋(Breadth First Search)。它的遍歷規則:先訪問完當前頂點的所有鄰接點。先訪問的頂點的鄰接點先於後訪問頂點的鄰接點被訪問。演算法思想:使用佇列的資料結構(FIFO (First In First Out)),將一個頂點加入佇列,然

的廣度優先鄰接矩陣

廣度優先遍歷是連通圖的一種遍歷策略。其基本思想如下: 1、從圖中某個頂點V0出發,並訪問此頂點; 2、從V0出發,訪問V0的各個未曾訪問的鄰接點W1,W2,…,Wk;然後,依次從W1,W2,…,Wk出發訪問各自未被訪問的鄰接點; 3、重複步驟2,直到全部頂

無向-鄰接矩陣-寬度優先-BFS C程式碼實現

一、BFS演算法思路本演算法以無向圖為例,儲存方式採用鄰接矩陣1)將該網以鄰接矩陣的方式儲存,由於這裡的示例採用無向圖,因此它是一個對稱陣2)選取A點為起始點,訪問此頂點,用一個visit的bool型陣列記錄訪問狀態(false表示未被訪問,true表示已訪問)3)從A的未被

基於鄰接矩陣的無向的廣度優先

輸入第一行為整數n(0 < n < 100),表示資料的組數。 對於每組資料,第一行是兩個整數k,m(0 < k < 100,0 < m < k*k),表示有m條邊,k個頂點。 下面的m行,每行是空格隔開的兩個整數u,v,表示一條連線u,v頂點的無向邊。