贪心法解决最短路径问题

一、实验目的

1、精通贪心算法概念;
2、精通贪心算法的基本要素;
3、精通贪心算法的解题步骤与算法柜架;
4、通过应用范例掌握贪心算法;

二、实验原理

1、贪心算法
贪心算法(又称贪婪算法)是指,在对问题求解时,总是做出在当前看来是最好的选择。也就是说,不从整体最优上加以考虑,他所做出的仅是在某种意义上的局部最优解。贪心算法不是对所有问题都能得到整体最优解,但对范围相当广泛的许多问题他能产生整体最优解或者是整体最优解的近似解。
2、贪心算法的基本思想
  1)建立数学模型来描述问题。
  2)把求解的问题分成若干个子问题。
3)对每一子问题求解,得到子问题的局部最优解。
4)把子问题的解局部最优解合成原来解问题的一个解。

三、实验原理

1.给定有向带权图,求给定顶点(源点)到其他所有各点的最短路径长度;
2.通过上机实验进行贪心算法实现;
3. 保存和打印出程序的运行结果,并结合程序进行分析,上交实验报告。

四、代码

#include<iostream>
#include<iomanip>
using namespace std;
#define INT 10000
int dist[100];//源点到顶点i的最短距离
int visited[100];
int path[100];//记录最短路的路径
struct Graph{
	int v_num;//顶点数
	int e_num;//边数
	int matrix[100][100];//邻接矩阵

};
void Dijkstra(Graph a,int source) {
	for (int i = 1;i <= a.v_num;i++) {
		visited[i] = 0;
	}
	visited[source] = 1;
	for (int i = 1;i <= a.v_num;i++) {
		dist[i] = a.matrix[source][i];
		path[i] = source;
	}
	int min_cost;//权值最小
	int min_cost_index;//权值最小的下标
	for (int i = 1;i <= a.v_num;i++) {//找到源点到另外几个点的最短路径
		min_cost = INT;
		for (int j = 1;j < a.v_num;j++) {
			if (!visited[j] && dist[j] < min_cost) {//找到权值最小
				min_cost = dist[j];
				min_cost_index = j;
			}
		}
		visited[min_cost_index] = 1;//找到该点,标记
		for (int j = 1;j <= a.v_num;j++) {//更新dist数组
			if (!visited[j] && a.matrix[min_cost_index][j] != INT && ((a.matrix[min_cost_index][j] + min_cost) < dist[j])) {
				dist[j] = a.matrix[min_cost_index][j] + min_cost;
				path[j] = min_cost_index;
			}
		}
	}
}
int main() {
	Graph a;
	int u, v, w;
	int source;
	cout<<"请输入图的定点数"<<endl;
	cin >> a.v_num;
	cout<<"请输入图的边数"<<endl;
	cin >> a.e_num;
	for (int i = 1;i <= a.v_num;i++) {
		for (int j = 1;j <= a.v_num;j++) {
			a.matrix[i][j] = INT;//初始化邻接矩阵
		}
	}
	cout << "请输入有向边及权值" << endl;
	for (int i = 1;i <= a.e_num;i++) {
		cin >> u >> v >> w;
		a.matrix[u][v] = w;
	}
	/*for (int i = 1;i <= a.v_num;i++) {//输出邻接矩阵
		for (int j = 1;j <= a.v_num;j++) {
			cout << setiosflags(ios::left) << setw(7) << a.matrix[i][j];
		}
		cout << endl;
	}*/
	cout << "请输入源点" << endl;
	cin >> source;
	Dijkstra(a,source);
	for (int i = 1;i <= a.v_num;i++) {
		if (i != source) {
			cout << source << "到" << i << "最短距离是:" << dist[i] << ",路径是:" << i;
			int t = path[i];
			while (t != source) {
				cout << "——" << t;
				t = path[t];
			}
			cout << "——" << source << endl;
		}
	}
	system("pause");
}

五、实验结果

在这里插入图片描述

  • 5
    点赞
  • 56
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值