1. 程式人生 > >Dijkstra演算法的虛擬碼和C語言版本,還是模版

Dijkstra演算法的虛擬碼和C語言版本,還是模版

虛擬碼:

//  初始化,設從0開始
for i=[0,n)
    dist[i] = map[0][i]
visit[0] = true;
 
for i=[1,n)
    //  尋找最短路徑(s,t),同時把t加入S集合
    min = MAX_VALUE
    for j=[0,n)
        if !visit[j] && dist[j]<min
            min = dist[j]//記錄最小值和最小值的下標
	    min_j = j       
 
    visit[j] = true
 
    //  鬆弛邊(t,v),其中v為頂點
    for k=[0,n)
        if !visit[k] && dist[k]>dist[j]+tab[j][k]
            dist[k] = dist[j]+tab[j][k]

#include <stdio.h>
#define INFINITY 0x7f7f7f7f  //頂點之間不可達時,map[][]初始化為該值
#define MAXNUM 100
int map[MAXNUM][MAXNUM];//這三個陣列看名字都懂的
int visited[MAXNUM];
int dist[MAXNUM];
int n,e,startp,endp;//e-邊數,n-頂點數,startp-源點,endp-目標點
int dijkstra(){
	int i,j,k,min,min_i;
	int res = 0;
	for(i = 0;i < n;i++){
		dist[i] = map[startp][i];
		visited[i] = 0;
	}
	visited[startp] = 1;
	for(i = 1;i < n;i++){
		min = INFINITY;
		for(j = 0;j < n;j++){
			if(!visited[j] && dist[j] < min){
				min = dist[j];
				min_i = j;
			}
		}
		visited[min_i] = 1;
		for(k = 0;k < n;k++){
			if(!visited[k] && (dist[k] > (dist[min_i] + map[min_i][k])))
				dist[k] = dist[min_i] + map[min_i][k];
		}
	}
	return dist[endp];
}

注意:表示邊不可達的值不能太大,整型為32的機器絕不能設定為0x7FFFFFFF,因為計算dist[k]>dist[j]+tab[j][k]時會溢位導致結果出錯。

相關推薦

Dijkstra演算法虛擬C語言版本還是模版

虛擬碼: //  初始化,設從0開始 for i=[0,n)     dist[i] = map[0][i] visit[0] = true;   for i=[1,n)     //  尋找最短路

生產者消費者問題 虛擬C語言多執行緒實現

生產者消費者問題是作業系統中的一個經典的問題。 他描述的是一個,多個生產者與多個消費者共享多個緩衝區的事情,具體的定義百度。 然後看了作業系統的書籍如何解決書上給的虛擬碼是這樣的 item B[k]; semaphore empty; empty

全排列演算法的思想C語言的程式碼實現

一、演算法思想 1、根本思想:遞迴 2、舉例設R={3,5,8,2}為需要排列的元素集合,{3,5,8,2}的全排列=3後面跟著{5,8,2}的全排列+5後面跟著{3,8,2}的全排列+8後面跟著{3,5,2}的全排列+2後面跟著{3,5,8}的全排列。對於{5,8,2

通過編寫c語言程序運行時實現打印另一個程序的源代行號

clas 行號 意義 spa clu 可執行 stdlib.h 讀取 進行 2017年6月1日程序編寫說明: 1.實現行號的打印,實現代碼的讀取和輸出,理解主函數中的參數含義。 2.對fgets函數理解不夠 3.對return(1); return 0的含義理解不夠 4.未

Apriori演算法詳解之【二、虛擬例子】

上一篇文章中對Apriori演算法進行了簡單的描述(http://blog.csdn.net/lizhengnanhua/article/details/9061755),現在用虛擬碼實現,及對經典例子進行描述(紅蘭PPT上之摘抄)。 一、Apriori演算法虛擬碼實現:

歸併排序演算法虛擬實現

虛擬碼 MERGE(A,p,q,r) n1=q-p+1; n2=r-q; create new arrays L[n1+1] and R[n2+1] for i=0 to n1-1 L[i]=A[p+i]

最短路徑Dijkstar演算法Floyd演算法詳解(c語言版)

轉載請註明出處:http://blog.csdn.net/crescent__moon/article/details/16986765 先說說Dijkstra吧,這種演算法只能求單源最短路徑,那麼什麼是單源最短路徑呢?就是隻能求一個點到別的點最短路徑,而不能求所有點到其它

C#)A*演算法虛擬及原始碼

using UnityEngine; using System.Collections; public class Node { /*邏輯中用的*/ public int gCost; public int hCost; public int fCost {

PCA演算法的數學原理C++語言(Eigen庫)實現

PCA演算法的數學原理最近在學習影象處理相關方面的知識,在影象壓縮時用到主成分分析演算法(Principal Component Analysis PCA)。數學理論主要參考了這篇部落格點選開啟連結,博主寫的非常好,通俗易懂。這裡總結了一下PCA演算法的實現步驟如下:設有m條

淺析c++c語言的enum類型

gre gree 但是 最大 src 淺析 end cnblogs () 1.先看c語言枚舉類型 1.c語言定義枚舉類型,每一個枚舉元素都是一個整數2.註重數據類型,沒有數據類型限定3.相鄰枚舉元素相差整數4.可以通過整數訪問,不夠安全 2.上代碼: 1 #includ

用樹莓派實現RGB LED的顏色控制——C語言版本

個數 hang clu 代碼 stdio.h 標準 tro color sage 用樹莓派實現RGB LED的顏色控制 RGB色彩模式是工業界的一種顏色標準。是通過對紅(R)、綠(G)、藍(B)三個顏色通道的變化

201671010139 2016-2017-2 JAVA C語言的語法區別

tro 特點 建立 優點 cor ext 虛函數 ref strong   java和c語言的語法上有很多相似的地方,但也有很多不同。 一,在初始值的區別   在C語言中,是可以不初始化使用的   而在JAVA中,是必須初始化值的 二,在抽象方法或抽象類的區別   C語言的

Java 自增(++) C語言中自增的區別

%d 區別 但是 [] .cn cnblogs 微軟雅黑 自增 華麗 在Java、c語言等高級語言中自增和自減的作用基本一致,都是變量自身加一或減一。下面我只對自增進行說明,自減是類似的。 自增運算符(++),有兩種書寫形式,一個是在變量前: ++ num; 另一種

Tinyhttpd - 超輕量型Http Server使用C語言開發全部代只有502行(包括註釋)附帶一個簡單的Client

net 事件驅動 免費 好評 lua ansi c tor 這一 通過 - 2. Tinyhttpd tinyhttpd是一個超輕量型Http Server,使用C語言開發,全部代碼只有502行(包括註釋),附帶一個簡單的Client,可以通過閱讀這段代碼理解一個 Htt

VC++C語言中常見數據類型轉換為字符串的方法

char* 北京 相同 字符指針 ascii bst sdn sprint 出現 1。短整型(int) itoa(i,temp,10);///將i轉換為字符串放入temp中,最後一個數字表示十進制 itoa(i,temp,2); ///按二進制方式轉換 2。長整型(long

20165231 預備作業二:學習基礎C語言基礎調查

oid clu 百度知道 保持 運行 建議 內聚 理解 加減乘除 微信文章感想 讀了婁老師微信公眾號中的文章,老師給我們的啟示首先就是要堅持,萬事開頭難,但是只要肯堅持就一定會有所成就,不管是學習還是生活方面。其中最有觸動的就是減肥了,是我三四年來一直難以完成的目標。如果可

20165303學習基礎C語言基礎調查

過程 度量 弱點 指針 計算 指針數組 數組指針 服務 發生 20165303學習基礎和C語言基礎調查 技能學習心得 我認為我的乒乓球打的還不錯,不能說非常好,但是基本的一些技巧都還是會的,小時候爸爸就非常愛看乒乓球比賽,有時候也帶著我一起看,最開始看的時候我發現激烈的比

20165339 學習基礎c語言基礎調查

指針函數 理論 引用 程序 可能 關系 知識點 比較 方法 讀中學讀後感 我認為給學生具體的, 能實踐的, 能馬上看到因果關系的教材和練習, 是激發學生興趣, 好奇心, 求知欲的好方法。 我就是這樣學習編程和軟件開發的。 所以我對「習而學」的方法很有好感。軟件工程有理論的

20165220 學習基礎C語言基礎調查

函數指針 void 內心 迷茫 開始 學習 模板 我們 scanf # # # # 我覺得我打遊戲(不知道算不算一技之長)畢竟從小學一年級就接觸到了各種形形色色的遊戲,講道理其實我的遊戲天賦畢竟還是很大的,從意識到感覺我覺得都比大多數人好一些,其實吧打遊戲打得好也是很不容易

20165235 學習基礎C語言基礎調查

mys 文本文 cnblogs 教材 getchar eof 學習 都是 file 20165235 學習基礎和C語言基礎調查 首先第一個問題:你有什麽技能比大多人(超過90%以上)更好?感覺很難回答這種問題,其實我對很多東西挺感興趣的,如果非要拿出一種比較突出的技能的話