圖的鄰接表 表示 DFS 和BFS C++實現
/* * File name : Lgraph.cpp * Function : 圖的學習, 鄰接表 深度優先遍歷和廣度優先遍歷 C++實現 * Created on : 2016年5月30日 * Author : [email protected] * Copyright : 歡迎大家和我一起交流學習,轉載請保持原始檔的完整性。 任何單位和個人不經本人允許不得用於商業用途 input: 5 6 0 A 0 B 1 2 A 0 C 2 5 A 0 E 4 3 B 1 D 3 4 D 3 E 4 2 E 4 C 2 5 */ #include <cstdio> #include <iostream> #pragma warning(disable:4996) using namespace std; #define MAX 10 typedef struct EdgeNode{ char start_name; char end_name; int start; int end; int weight; struct EdgeNode * next; }EdgeNode; typedef struct { int vertex_num; int edge_num; int graph_type; EdgeNode * List[MAX]; int mark[MAX]; }Lgraph; /*************************************************************************************************/ typedef struct { int store[MAX * MAX]; int head; int tail; }Squeue; void queue_init(Squeue & Q) { Q.head=0; Q.tail=0; } void queue_in(Squeue & Q, int V) { if( Q.tail == MAX * MAX ) cout<<"out of index"<<endl; Q.store[ Q.tail ++]=V; } int queue_out(Squeue &Q) { if( Q.tail==Q.head) cout<<"empty"<<endl; return Q.store[ Q.head++]; } bool queue_is_empty(Squeue &Q) { return ( Q.tail==Q.head) ? true : false; } /**************************************************************************************************/ void create_graph( Lgraph & G); void graph_display( Lgraph & G); void gbfs( Lgraph & G); void gdfs(Lgraph & G); int main(int argc, char** argv) { freopen("input.txt","r",stdin); Lgraph G; create_graph( G); graph_display(G); gdfs(G); gbfs(G); return 0; } void create_graph( Lgraph & G) { cout<<"請輸入圖的頂點個數 和 邊的個數: "<<endl; cin>>G.vertex_num>>G.edge_num; cout<<"請輸入圖的型別: 0無向圖 1有向圖"<<endl; cin>>G.graph_type; for(int i=0; i < G.vertex_num; i++) { G.List[i]=NULL; } for( int i=0; i < G.edge_num ; i++) { int start,end,weight; char start_name,end_name; EdgeNode * tmp= new EdgeNode; cout<<"請輸入第"<<i<<"條邊的起點名字,起點序號,終點名字,終點序號和權值"<<endl; cin>>start_name >>start >>end_name>>end>>weight; tmp->start=start; tmp->start_name=start_name; tmp->end=end; tmp->end_name=end_name; tmp->weight=weight; tmp->next=G.List[ start ]; G.List[ start ]=tmp; if( G.graph_type==0 )//是 無向圖, 則 插入到終點的連結串列中 { EdgeNode * T= new EdgeNode; T->start=end; T->start_name=end_name; T->end=start; T->end_name=start_name; T->weight=weight; T->next=G.List[ end ]; G.List[ end ]=T; } } } void graph_display( Lgraph & G) { EdgeNode * tmp; for(int i=0; i<G.vertex_num;i++) { tmp=G.List[i]; if(tmp == NULL) continue; cout<<"頂點"<<i<<"名字是: "<<tmp->start_name<<" , 相鄰頂點有:"<<endl; while( tmp) { cout<<" "<<tmp->end_name<<" , 該邊權重是"<<tmp->weight<<endl; tmp=tmp->next; } } } void dfs(Lgraph & G, int k) { int end; G.mark[k]=1; cout<<G.List[k]->start_name<<"\t"; end=G.List[k]->end; if( G.mark[end]==0) { dfs(G,end); } } void gdfs(Lgraph & G) { cout<<"圖的深度優先遍歷 : "<<endl; for( int i=0; i< G.vertex_num; i++) { G.mark[i]=0; } for(int k=0; k < G.vertex_num; k++) { if( G.mark[k]==0) { dfs(G,k); } } cout<<endl; } void gbfs( Lgraph & G) { cout<<"圖的廣度優先遍歷 : "<<endl; for( int i=0; i< G.vertex_num; i++) { G.mark[i]=0; } for(int k=0; k < G.vertex_num; k++) { if( G.mark[k]==0) { G.mark[k]=1; cout<<G.List[k]->start_name<<"\t"; Squeue Q; queue_init(Q); queue_in(Q, k); while( queue_is_empty(Q)==0 ) { int i=queue_out(Q) ; int next=G.List[i]->end; if( G.mark[next]==0 ) { cout<<G.List[next]->start_name<<"\t"; G.mark[next]=1; queue_in(Q,next); } } } } cout<<endl; }
相關推薦
圖的鄰接表 表示 DFS 和BFS C++實現
/* * File name : Lgraph.cpp * Function : 圖的學習, 鄰接表 深度優先遍歷和廣度優先遍歷 C++實現 * Created on : 2016年5月30日 * Author : [email
圖的遍歷演算法DFS和BFS(C++)
圖的遍歷演算法程式(C++實現) //圖的遍歷是指按某條搜尋路徑訪問圖中每個結點,使得每個結點均被訪問一次,而且僅被訪問一次。圖的遍歷有深度遍歷演算法和廣度遍歷演算法,程式如下: #include <iostream> //#include <malloc.h> #define
資料結構之——用C++實現鄰接表的DFS與BFS
首先我們要知道鄰接表的基本思想: 鄰接表儲存的基本思想:對於圖的每個頂點vi,將所有鄰接於vi的頂點鏈成一個單鏈表,稱為頂點vertex的邊表(對於有向圖則稱為出邊表),所有邊表的頭指標和儲存頂點資訊的一維陣列構成了頂點表。 在這裡我打算將一個無向圖的鄰接表的建立,以及相
深度優先搜尋DFS——圖鄰接表表示
作為圖的一個基本演算法,DFS應用很廣,可以推廣出很多實用的演算法。下面貼出一個比較常用的用鄰接表表示的圖DFS。 /* 圖鄰接表表示DFS input: 1 7 A 1 5 B 2 4 3 C 2 4 2 D 3 6 5 2 E 3 7 4 1 F 1 4 G 1 5
圖——鄰接表表示(C++代碼)
16px other ats 存儲 一個 不可 groups 初始 create 上學期學了數據結構,但是總是掌握不牢固,這學期的算法課給了這樣一道OJ題目 描述: There is a group of people playing table tennis
12.boost有向無向圖鄰接表表示
blog 所有結點 ace 都是 col vector fin std pan 1 #include <iostream> 2 #include <boost/config.hpp> 3 //圖(矩陣實現) 4 #include <b
圖的遍歷DFS和BFS
鄰接矩陣的DFS和BFS遍歷 鄰接矩陣實現圖 #define Maxnum 100; #define Maxnum 100 typedef struct ENode * Edge; struct ENode { int V1, V2; int weight; }; typedef s
資料結構(17)--圖的遍歷DFS和BFS
參考書籍:資料結構(C語言版)嚴蔚敏吳偉民編著清華大學出版社 從圖中某一頂點出發訪遍圖中其餘頂點,且使每一個頂點僅被訪問一次。這一過程就叫做圖的遍歷。 示例: 1.深度優先遍歷 基本思想: 從圖中某頂點V0出發,訪問此頂點,然後依次從V0的各個未被訪問的鄰
圖——鄰接表表示(實現深度優先遍歷、廣度優先遍歷)
程式碼有部分解析:#include<iostream> #include<stdio.h> #include<stdlib.h> #include<iomanip> using namespace std; #define T
資料結構之圖(鄰接表儲存,DFS和BFS遍歷)
來看下面的一個簡單的圖, 那麼這樣的一個圖,我們應該用什麼儲存結構來儲存它呢?常用的是鄰接矩陣和鄰接表,這裡鄰接矩陣不做講解,如下所有程式碼都是以鄰接表作為儲存結構,所以這裡就只講解下鄰接表。那麼什麼是鄰接表呢?如何構造呢? 鄰接表是一
用鄰接表儲存有向圖實現的dfs和bfs
#include<iostream> #include<stdlib.h> #define MAX 20 using namespace std; class ArcNode { public: int adjvex; //儲存弧的終止位置 Ar
實驗四(建圖,無向圖+鄰接矩陣(BFS,DFS(遞迴+非遞迴)),有向圖+鄰接表(BFS,DFS(遞迴+非遞迴)),拓撲排序)
//Sinhaeng Hhjian #include<bits/stdc++.h> using namespace std; const int N=100; const int MAX=1000; int book[N], cnt; struct node{
圖的鄰接表表示法(C語言)
鄰接表 鄰接表資料結構型別如下: #define MaxVertices 100 typedef struct node{ //邊表 int adjvex; node*
有向圖---鄰接表(BFS+DFS)
#include <stdio.h> #include <malloc.h> #define true 1 #define false 0 #define INFINITY 1000000 #define MaxVertexNum 100 #
DFS和BFS(無向圖)Java實現
ges return deque es2017 system let integer image class package practice; import java.util.Iterator; import java.util.Stack; import edu
鄰接表表示圖
還要 day size tro OS 信息 def sizeof 指針 對於鄰接表,G[N]為指針數組,對應矩陣每行一個鏈表,只存非0元素 指針數組裏的每一個指針都是一個單鏈表的頭指針,單鏈表裏每個節點裏存儲的是圖中每條邊的信息。 鄰接表包括一個頂點表和一個邊表。頂點表包
C 圖 鄰接表的基本操作
文章目錄 基本思路 儲存結構 建立 列印 廣度遍歷 深度遍歷 完整程式碼 基本思路 強烈推薦大家看看,同胞寫的,講的特別清楚 圖 – 我的理解就是若干個節點,再加上他們之間的聯絡;這樣就是兩塊內容,一個放節點
C++資料結構 22 圖-鄰接表
#include <iostream> #include <list> using namespace std; class Vertex { }; template<class T> class Graph { public: Gra
(Java資料結構和演算法)圖的DFS和BFS
DFS+BFS import java.util.*; //以無向圖為例,實現圖的深度優先搜尋和廣度優先搜尋 class Graph{ public int[][] adjacencyMatrix;//鄰接矩陣,1代表有邊,0代表沒有邊 public int arcNumb
圖(鄰接矩陣與鄰接表表示法)
圖的鄰接矩陣表示法 #define MaxVertexNum 100 /* 最大頂點數設為100 */ #define INFINITY 65535 /* ∞設為雙位元組無符號整數的最大值65535*/ typedef int Vertex;