1. 程式人生 > >Dijkstra(鄰接矩陣有向圖)C 實現~

Dijkstra(鄰接矩陣有向圖)C 實現~

檔案頭:

#include<stdio.h>  
#include<stdlib.h>  
#include<ctype.h> 
#define NOTEXIST -1
#define BEGIN -1 
#define MAXVEX 100  
#define INFINITY 65535  
#define TRUE 1  
#define FALSE 0   
typedef int EdgeType;
typedef char VertexType;
int path[MAXVEX];
int dist[MAXVEX];
int known[MAXVEX];

typedef struct Graph {
	VertexType vex[MAXVEX];
	EdgeType edge[MAXVEX][MAXVEX];
	int vex_num, edge_num;
}Graph;
核心程式碼: 
void init_graph(Graph *g, int end)
{
	int i;
	for (i = 0; i < g->vex_num; i++) {
		path[i] = NOTEXIST;
		known[i] = FALSE;
		dist[i] = INFINITY;
	}

	dist[end] = 0;
}

int find_min(Graph g)
{
	int min;
	min = INFINITY;
	int i;
	int index;
	for (i = 0; i < g.vex_num; i++) {
		if (known[i] == FALSE && dist[i] < min) {
			index = i;
			min = dist[i];
		}
	}
	if (min == INFINITY)
		return -1;
	else
		return index;
}

void Dijkstra(Graph g)
{
	int v;
	int w;
	while (1) {
		v = find_min(g);
		//printf("v = %d", v);
		if (v == NOTEXIST)
			break;
		known[v] = TRUE;
		for (w = 0; w < g.vex_num; w++) {
			if (known[w] == FALSE && (dist[v] + g.edge[v][w] < dist[w])) {
				dist[w] = dist[v] + g.edge[v][w];
				path[w] = v;
			}
		}
	}
}

完整實現:

#include<stdio.h>  
#include<stdlib.h>  
#include<ctype.h> 
#define NOTEXIST -1
#define BEGIN -1 
#define MAXVEX 100  
#define INFINITY 65535  
#define TRUE 1  
#define FALSE 0   
typedef int EdgeType;
typedef char VertexType;
int path[MAXVEX];
int dist[MAXVEX];
int known[MAXVEX];

typedef struct Graph {
	VertexType vex[MAXVEX];
	EdgeType edge[MAXVEX][MAXVEX];
	int vex_num, edge_num;
}Graph;

char read_char()
{
	char ch;
	do {
		ch = getchar();
	} while (!isalpha(ch));
	return ch;
}

int get_pos(Graph g, char ch)
{
	int i;
	for (i = 0; i < g.vex_num; i++) {
		if (g.vex[i] == ch)
			return i;
	}
	return -1;
}

void create_graph(Graph *g)
{
	int i, j, k;
	printf("請輸入頂點數與邊數:\n");  
	scanf("%d%d", &g->vex_num, &g->edge_num);
	for (i = 0; i < g->vex_num; i++) {
		for (j = 0; j < g->vex_num; j++) {
			if (i == j) {
				g->edge[i][j] = 0;
			}
			else
				g->edge[i][j] = INFINITY;
		}
	}
	printf("請輸入頂點資訊:\n");  
	for (i = 0; i < g->vex_num; i++) {  
		g->vex[i] = read_char();
	}
	printf("請輸入邊的資訊:\n");  
	char c1, c2;
	int p1, p2, w;
	for (k = 0; k < g->edge_num; k++) {
		c1 = read_char();
		c2 = read_char();
		scanf("%d", &w);
		p1 = get_pos(*g, c1);
		p2 = get_pos(*g, c2);
		g->edge[p1][p2] = w;//有向邊的權重  
	}
}

void init_graph(Graph *g, int end)
{
	int i;
	for (i = 0; i < g->vex_num; i++) {
		path[i] = NOTEXIST;
		known[i] = FALSE;
		dist[i] = INFINITY;
	}

	dist[end] = 0;
}

int find_min(Graph g)
{
	int min;
	min = INFINITY;
	int i;
	int index;
	for (i = 0; i < g.vex_num; i++) {
		if (known[i] == FALSE && dist[i] < min) {
			index = i;
			min = dist[i];
		}
	}
	if (min == INFINITY)
		return -1;
	else
		return index;
}

void Dijkstra(Graph g)
{
	int v;
	int w;
	while (1) {
		v = find_min(g);
		//printf("v = %d", v);
		if (v == NOTEXIST)
			break;
		known[v] = TRUE;
		for (w = 0; w < g.vex_num; w++) {
			if (known[w] == FALSE && (dist[v] + g.edge[v][w] < dist[w])) {
				dist[w] = dist[v] + g.edge[v][w];
				path[w] = v;
			}
		}
	}
}

void print_graph(Graph g)
{
	int i, j;
	for (i = 0; i < g.vex_num; i++) {
		for (j = 0; j < g.vex_num; j++) {
			if (g.edge[i][j] == INFINITY)
				printf("%5c", '*');
			else {
				printf("%5d", g.edge[i][j]);
			}
		}
		printf("\n");
	}
}

void print_path2(Graph g, int end)//這裡 直接傳遞最後位置的索引 
{
	if (path[end] != BEGIN) {
		print_path2(g, path[end]);
		printf("->"); 
	}
	printf("%c ", g.vex[end]);
}

int main()
{
	Graph g;
	int start, end;
	char c1, c2;
	create_graph(&g);
	printf("請輸入起始點與終點:\n");
	c1 = read_char();
	c2 = read_char();
	start = get_pos(g, c1);
	end = get_pos(g, c2);
	init_graph(&g,start);
	Dijkstra(g);
	if(dist[end] == INFINITY)
		printf("\n該兩點間無路徑.");
	else{
		printf("最短路徑為:\n\n");
		print_path2(g, end);
		printf("\n\n最小花費 : %d",dist[end]);
	}	
	
	getchar();
	getchar();
	getchar();
	return 0;
}

相關推薦

Dijkstra鄰接矩陣C 實現~

檔案頭: #include<stdio.h> #include<stdlib.h> #include<ctype.h> #define NOTEXIST -1 #define BEGIN -1 #define MAXVEX 1

鄰接矩陣

轉自:http://www.cnblogs.com/skywang12345/ 鄰接矩陣有向圖的介紹 鄰接矩陣有向圖是指通過鄰接矩陣表示的有向圖。 上面的圖G2包含了"A,B,C,D,E,F,G"共7個頂點,而且包含了"<A,B>,<B,C>,<B,E>,<

鄰接矩陣(一)之 C語言詳解

/* * 建立圖(自己輸入) */ Graph* create_graph() { char c1, c2; int v, e; int i, p1, p2; Graph* pG; // 輸入"頂點數"和"邊數" printf("

鄰接矩陣(二)之 C++詳解

/* * 建立圖(自己輸入資料) */ MatrixDG::MatrixDG() { char c1, c2; int i, p1, p2; // 輸入"頂點數"和"邊數" cout << "input vertex number: "

鄰接矩陣(三)之 Java詳解

/* * 建立圖(自己輸入資料) */ public MatrixDG() { // 輸入"頂點數"和"邊數" System.out.printf("input vertex number: "); int vlen = readInt(); Sys

鄰接矩陣 判斷是否環 是否連通 DFS C實現~

1 DFS 搜尋 修改             有向圖有環需要注意 : 按照路徑方向能組成迴路才叫有環               例如 三邊 A->B, A->C, B->C則 構成的不是環                           A->

C++實現

graph.h: #ifndef MAIN_WTF_GARPH_H #define MAIN_WTF_GARPH_H #include<cstdlib> #include<set> namespace main_wtf_graph { template <cl

網絡帶權的的最短路徑Dijkstra算法

ngx 算法實現 article 前驅 長度 單源最短路徑 最短路徑 貪心 常用方法 什麽是最短路徑? 單源最短路徑(所謂單源最短路徑就是只指定一個頂點,最短路徑是指其他頂點和這個頂點之間的路徑的權值的最小值) 什麽是最短路徑問題? 給定一帶權圖,圖中每條邊的權值是非負的

[] 7.28 找出u到v的所有路徑-鄰接-DFS

題目來源:嚴蔚敏《資料結構》C語言版本習題冊 7.28 【題目】已知有向圖和圖中兩個頂點u和v,試編寫演算法求有向圖中從u到v的所有簡單路徑,並以下圖為例手工執行你的演算法,畫出相應的搜尋過程圖 【測試資料】 【結果】 【答案】 /*----------

論】單源點最短路模板Dijkstra

#include <cstdio> #include <iostream> #include <cstring> #include <queue> #in

鄰接表非遞迴廣搜

此程式碼是資料結構的原始模板,可以剛接觸或考研時借鑑下,不適於刷題#include<stdio.h> #include<malloc.h> #include<queue&

vijos 1423 最短路or環

取消 main 必須 測試 主辦方 marker ons eof eap 最佳路線 描述 年久失修的賽道令國際汽聯十分不滿。汽聯命令主辦方立即對賽道進行調整,否則將取消其主辦權。主辦方當然必須馬上開始行動。 賽道測評人員經過了三天三夜的數據采集,

9、【資料結構】鄰接矩陣鄰接

一、鄰接矩陣有向圖 1、基本定義 #define MAX 10 class MatrixDG { private: char mVexs[MAX]; // 頂點集合 int mVexNum; // 頂點數

之從一個頂點到其餘各個頂點的最短路徑

目錄 從一個頂點到其餘各個頂點最短路徑的簡介 舉例以及詳細分析 程式碼塊 測試結果 從一個頂點到其餘各個頂點最短路徑的簡介(又名單元最短路徑) 1.定義概覽 Dijkstra(迪傑斯特拉)演算法是典型的單源最短路徑演算法,用於計算一個節點到其他所

杭電-1599 find the mincost route最小環

find the mincost route Time Limit: 1000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 4164   

Floyd-Warshall演算法

#include<stdio.h> #include<malloc.h> #include<string.h> #include<stack> usin

的應用——拓撲排序

1、基本概念: 有序圖,每個頂點都有前驅和後繼的關係。 現實生活中我們可以用一個有向圖來表示一個工程,頂點表是活動,有向邊A---------->B表示:A必須先於活動B進行。這種有向圖叫做“  頂表示活動的網路(activity  on  vertices)” ——

普通dijkstra鄰接矩陣

#include<cstdio> #include<cstring> #include<cmath> #include<algorithm> #incl

鄰接

image posit 結構體 blob div def reader 函數 另一個 轉自:http://www.cnblogs.com/skywang12345/ 鄰接表有向圖的介紹 鄰接表有向圖是指通過鄰接表表示的有向圖。 上面的圖G2包含了"A,B,C,D,

鄰接矩陣(二)之 C++詳解

/* * 建立圖(自己輸入資料) */ MatrixUDG::MatrixUDG() { char c1, c2; int i, p1, p2; // 輸入"頂點數"和"邊數" cout << "input vertex number: