1. 程式人生 > >用c++程式碼實現貪心演算法求解最短路徑問題

用c++程式碼實現貪心演算法求解最短路徑問題

貪心演算法求解最短路徑問題:

假設演算法要處理下圖,需要把圖資料組織存放到相應的資料結構中。

 這個是標頭檔案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;
}