一、实验目的
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");
}