用c++程式碼實現貪心演算法求解最短路徑問題
阿新 • • 發佈:2019-01-09
貪心演算法求解最短路徑問題:
假設演算法要處理下圖,需要把圖資料組織存放到相應的資料結構中。
這個是標頭檔案stdafx.h中的內容
#pragma once
#include <stdio.h>
#include <tchar.h>
#include <iostream>
tanxin_ari.cpp中的內容
#include "stdafx.h" using namespace std; int _tmain(int argc, _TCHAR* argv[]) { int graph[6][6] ={ {0 ,-1 ,15 ,-1 ,-1 ,-1 }, {2 ,0 ,-1 ,-1 ,10 ,30 }, {-1 ,4, 0 , -1,-1 ,10 }, { -1,-1, -1 ,0 ,-1 ,-1 }, { -1,-1, -1 ,15 ,0 ,-1 }, { -1,-1 ,-1 ,4 ,10 ,0 } }; //遍歷輸出:初始資料 for (int m = 0; m < 6; m++){ for (int n = 0; n < 6; n++){ cout << graph[m][n] << " "; } cout << endl; } /* //如果要自己輸入其他資料,就把下面這段解放出來。 //在沒有任何輸入的情況下,賦值: for (int m = 0; m < 6; m++){ for (int n = 0; n < 6; n++){ if (m == n){ graph[m][n] = 0; }else{ graph[m][n] = -1; } } } cout << "輸入規則:第一個數為起點,第二個數為終點,最後一個數為距離。" "相同兩個數,如<1,1>,距離為0;沒有輸入的距離自動為-1,既是從這點倒那點暫時無法到達,輸入負數開始運算" << endl; int i=1, j=1, k=0; int tag=1; do{ if(graph[i - 1][j - 1] < k && graph[i - 1][j - 1]!= -1 ){ }else{ graph[i - 1][j - 1] = k; } cin >> i; if (i >= 0){ cin >> j; if (j >= 0){ cin >> k; if (k >= 0){ cout << "輸入成功:" << endl; }else{ tag = 0; } }else{ tag = 0; } }else{ tag = 0; } } while (tag==1); */ //當起始為i時; for (int i = 1; i < 7; i++){ int tnum[6] = {0,0,0,0,0,0};//其中0代表這個數還沒有納入已經有的圈子。 tnum[i - 1] = 1; int tno = 0; //tno代表沒有被納入圈子的數字的個數. //為tno賦值。 for (int t = 0; t < 6;t++){ if (tnum[t]==0){ tno++; } } for (int d = 0; d <5;d++){ int min = 10000; //這個數為在未包含的部分中離起點最小的距離。 int min_num; //這個數為與起點之間出現min處的 數。分別為1到6 for (int q = 0; q < 6;q++){ if (tnum[q] == 0 && graph[i - 1][q] != -1 && graph[i - 1][q]<min){ min = graph[i - 1][q]; //找出min和min_num min_num = q + 1; } } tnum[min_num - 1] = 1; for (int q = 0; q < 6; q++){ if (tnum[q] == 0 && graph[min_num - 1][q] != -1){ if (graph[i - 1][q] == -1 || graph[i - 1][q]>(graph[min_num - 1][q] + min)){ //根據min和min_num跟新資料 graph[i - 1][q] = graph[min_num - 1][q]+min; } } } } } cout << "最後結果:" << endl; //遍歷輸出:最後結果 for (int m = 0; m < 6;m++){ cout << endl; for (int n = 0; n < 6;n++){ cout << graph[m][n] << " "; } } system("pause"); return 0; }