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: