贪心算法求解最短路径问题:
假设算法要处理下图,需要把图数据组织存放到相应的数据结构中。
这个是头文件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;
}