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最近鄰