1. 程式人生 > >BFS演算法(詳細C)

BFS演算法(詳細C)

最近學了圖的廣度和深度優先遍歷,但是廣度比深度要麻煩一些,用到了佇列,我就完全的按自己的思路寫了一段很長的程式碼,看了一些大神寫的,但其實可以比較簡單,其實圖也有多種表示方式,所以各個程式碼會有不同,下面給出我的程式。

#include<stdio.h>
#include<stdlib.h>
#define maxn 100
#define maxsize 100
typedef struct qnode * Queue;
typedef struct node * Gragh;
int visited[maxn];
struct qnode
{
	int data[maxsize];
	int front;
	int rear;
};
struct node
{
	int Nv;
	int Ne;
	int G[maxn][maxn];
};

Queue Createqueue()
{
	Queue Q=(Queue)malloc(sizeof(struct qnode));
	Q->front=Q->rear=0;
	return Q;
}

void Insertqueue(Queue Q,int x)
{
	if((Q->rear+1)%maxsize==Q->front)
	printf("Full!");
	else
	{
		Q->data[Q->rear]=x;
		Q->rear=(Q->rear+1)%maxsize;
	}
}

int Deletequeue(Queue Q)
{
	int temp;
	if(Q->front==Q->rear)
		return 0;
	else
	{
		temp=Q->data[Q->front];
		Q->front=(Q->front+1)%maxsize;
	}
	return temp;
}

Gragh Creategragh()
{
	int i,j,v,e,k,m;
	Gragh T=(Gragh)malloc(sizeof(struct node));
	printf("請輸入頂點:");
	scanf("%d",&v); //頂點
	printf("請輸入邊:");
	scanf("%d",&e);  //邊
	T->Nv=v;
	T->Ne=e;
	for(i=0;i<T->Nv;i++)
		for(j=0;j<T->Nv;j++)
			T->G[i][j]=0;
	for(i=0;i<T->Ne;i++)
	{
		scanf("%d %d",&k,&m);  //無權重的邊,且為無向圖
		T->G[k][m]=1;
		T->G[m][k]=1;
	}
	return T;
}

void bfs(Gragh g,int x,Queue Q)
{
	int i,temp;
	visited[x]=1;
	Insertqueue(Q,x);
	while(Q->front!=Q->rear)
	{
		temp=Deletequeue(Q);
		printf("正在遍歷%d個頂點\n",temp);
		for(i=0;i<g->Nv;i++)
		{
			if(g->G[i][temp]!=0&&visited[i]==0)
			{
				visited[i]=1;
				Insertqueue(Q,i);
			}
		}
	}
}

int main()
{
	int i;
	Queue Q=Createqueue();
	Gragh gragh=Creategragh();
	for(i=0;i<gragh->Nv;i++)
		visited[i]=0;
	bfs(gragh,0,Q);
	return 0;
}


這是我自己畫的一個圖,然後輸入進入,根據程式的結果,比較一下感受廣度優先遍歷的過程。(很抱歉上面的圖中0到4還有個線段沒畫出。)下面的程式執行情況上面部分也沒有顯示完全。


相關推薦

BFS演算法詳細C

最近學了圖的廣度和深度優先遍歷,但是廣度比深度要麻煩一些,用到了佇列,我就完全的按自己的思路寫了一段很長的程式碼,看了一些大神寫的,但其實可以比較簡單,其實圖也有多種表示方式,所以各個程式碼會有不同,

貪心演算法基於C++

文章基於此篇微信推送https://mp.weixin.qq.com/s/3h9iqU4rdH3EIy5m6AzXsg 簡介 動態規劃是一種由問題的最小子狀態(邊界)不斷推出更大的狀態,最後解決整個問題的解題思想。 基礎概念 最優子結構:狀態可被分解為的子狀態

資料結構常見的八大排序演算法詳細整理

2018年11月01日 21:38:04 雲淡風輕_737711464 閱讀數:3 個人分類: 資料結構

GBDT梯度提升決策樹演算法詳細

轉載地址:https://mp.weixin.qq.com/s?__biz=MzIzNDM2OTMzOQ==&mid=2247485043&idx=1&sn=0a207eb61e3119d06507e9c9a42c4164&chksm=e8f6

Python資料結構常見的八大排序演算法詳細整理

前言 八大排序,三大查詢是《資料結構》當中非常基礎的知識點,在這裡為了複習順帶總結了一下常見的八種排序演算法。 常見的八大排序演算法,他們之間關係如下: 排序演算法.png 他們的效能比較: 下面,利用Python分別將他們進行實現。

遺傳演算法Genetic Algorithm +C++實現解決TSP問題

概念 生物進化中的概念 遺傳演算法中的作用 環境 適應函式 適應性 適應函式值 適者生存 適應值大的解被保留

C/C++檔案輸入輸出詳細介紹

´在標頭檔案iostream中定義有兩個流類:輸入流類istream和輸出流類ostream,且用這兩個類定義了流物件cin和cout: ´Istream cin; ´ostream cout; ´cin是一個istream類的物件,它從標準輸入裝置(鍵盤)獲取資料

(排序演算法)linux c語言實現簡化版本的插入排序演算法二分插入

 二分插入演算法是在已經排序好的序列裡插入一個元素,是穩定的演算法,關鍵詞是折中。 比如說我要在12345678910裡插入一個3,那麼我先看看中間的數比3大,還是比3小,要是比3大,我就去後一半,如果是比3小,我就去前一半,現在進入某個一半後,再做如此操作,最後將其他的元

c語言折半查詢演算法二分查詢

二分查詢又稱折半查詢,優點是比較次數少,查詢速度快,平均效能好,佔用系統記憶體較少;其缺點是要求待查表為有序表,且插入刪除困難。因此,折半查詢方法適用於不經常變動而查詢頻繁的有序列表。首先,假設表中元素是按升序排列,將表中間位置記錄的關鍵字與查詢關鍵字比較,如果兩者相等,則查

氣泡排序演算法起泡排序及其C語言實現

起泡排序,別名“氣泡排序”,該演算法的核心思想是將無序表中的所有記錄,通過兩兩比較關鍵字,得出升序序列或者降序序列。 例如,對無序表{49,38,65,97,76,13,27,49}進行升序排序的具體實現過程如圖 1 所示: 圖 1 第一次起泡 如圖 1 所示是對無序表的第一次起泡排序,最終將無序

C語言作業系統——頁面置換演算法FIFO/LRU

由於本學期學習作業系統所以需要用程式碼實現一些演算法,本人大二由於對C語言掌握的不太好,所以一直逼著自己用C語言寫程式碼,還好寫出來了,在這裡與大家分享。首先建立一個工程檔案,本人喜歡建立一個頭檔案,一個功能檔案和一個主函式檔案。標頭檔案,page_replace.h#inc

搜素演算法基礎--DFS/BFS演算法JAVA

為了便於理解這裡的資料是一個無向圖,要求輸出遍歷順序 下面只給出用例和演算法,之後可以根據後面的三個題目進行深入學習 Input: 5 5 1 2 1 3 1 5 2 4 3 5 Output: 1 2 4 3 5 DFS im

C++ 雙向氣泡排序演算法Shaker Sort

一、概念(來源於百度百科)        傳統冒泡演算法原理        氣泡排序演算法的運作如下:(從後往前)             &nbs

拉格朗日插值演算法c++原始碼

C++程式實現Lagrange插值公式     Lagrange插值公式,是屬於數值分析方面的內容。此處我想用C++語言程式來實現n各插值節點插值公式的求解,並求出在某一個插值節點對應的函式值。   對於Lagrange插值演算法的基本思想,在這裡我只想略提兩點,一個是拉格朗

整型陣列處理演算法十四不用庫函式,用C語言實現將一整型數轉換成字串

不用庫函式,用C語言實現將一整型數轉換成字串,如:int a=123456,轉換成"123456"。 如題,要求將一整型數轉換為字串。這裡要考慮的是整型數可能是負數、正數和0。 實現如下: char

連通域標記演算法 基於深度優先搜尋的連通域標記演算法opencv C++實現

        上一篇我們講到了MATLAB中的bwlabel連通域標記演算法的C++實現https://blog.csdn.net/Dhane/article/details/81633723,今天我來講一講另一種相對比較容易想到的連通域標記演算法。簡單點說

C語言--氣泡排序法詳細註釋

     博主剛本科畢業,最近在寫程式的時候要將10000個數據進行排序,因為是學控制方向的,之前也沒接觸過這麼大資料量的排序,所以最先想起來的還是冒泡法,但發現頗為耗時。因此準備趁現在暑假,好好再複習複習一些基礎演算法,也為之後工作打好點基礎。      今晚是第一篇,

無權最短路徑BFS廣度優先搜尋演算法圖論

廣度優先搜尋(BFS)演算法類似於樹中的層次搜尋: 從任意點s出發,先遍歷與s相鄰的點,然後再遍歷於相鄰的點相鄰的點。注意有向圖必須是順方向的鄰接點。 為什麼說廣度優先搜尋可以用來求無權最短路徑呢?因為,廣度優先搜尋每次都會先發現距離s為k的所有頂點,然後才會 發現距離s

七大查詢演算法C語言程式碼實現

閱讀目錄 1、順序查詢 2、二分查詢 3、插值查詢 4、斐波那契查詢 5、樹表查詢 6、分塊查詢 7、雜湊查詢 查詢是在大量的資訊中尋找一個特定的資訊元素,在計算機應用中,查詢是常用的基本運算,例如編譯程式中符號表的查詢。本文簡單概括性的介紹了常見的七種查詢演算法

利用Python實現k最近鄰演算法 並識別手寫數字詳細註釋

    K最近鄰(k-Nearest Neighbor,KNN)分類演算法,是一個理論上比較成熟的方法,也是較為簡單的機器學習演算法之一。該方法的思路是:如果一個樣本在特徵空間中的k個最相似(即特徵空間中最鄰近)的樣本中的大多數屬於某一個類別,則該樣本也屬於這個類別。K最近鄰