贪心算法之Dijkstra
贪心算法的主要思想就是通过不断求解局部最优解,最后求出最优解或者最优解的近似值,不能保证一定为最优解。
Dijistra算法,选取没有选择过的点到已经选择过得点组成的集合中最短的距离的点。然后更新已选择的点到没有选择的点的距离。
已经选择的点是一个整体。
具体算法如下:
#include <iostream>
#include <stack> using namespace std; const int IDF = 1e7; //距离最大值
const int N = ; //点的数量最大值
int map[N][N]; //点与点之间的距离
int n; //点的数量
int m; //线的数量
int dist[N]; //源点到其他点的距离
bool flag[N]; //是否已加入找到集
int p[N]; //记录路径 void Dijkstr(int u); //计算距离 void findpath(int u); int main() {
int u, v, w; //起点 终点 权重
cout << "请输入点的个数:";
cin >> n;
cout << "请输入线的数量:";
cin >> m;
//初始化
for (int i = ; i < n; i++) {
for (int j = ; j < n; j++) {
map[i][j] = IDF;
}
}
cout << "请输入两点及两点之间的距离:" << endl;
while (m > ) {
cin >> u >> v >> w;
map[u][v] = min(w, map[u][v]);
m--;
}
cout << "请输入起点:";
cin >> u;
cout << "信息输入完毕,开始计算地杰斯特拉距离" << endl;
Dijkstr(u);
findpath(u);
return ;
} void findpath(int u) {
int temp;
stack<int> s;
cout<<"源点为:"<<u<<endl;
for(int i = ; i < n; i++){
temp = p[i];
while(temp != -){
s.push(temp);
temp = p[temp];
}
cout<<u<<"到"<<i<<"的距离为:"<<dist[i]<<";路径为:";
while(!s.empty()){
cout<<s.top()<<"--";
s.pop();
}
cout<<i<<endl;
}
} void Dijkstr(int u) {
//初始化
for (int i = ; i < n; i++) {
dist[i] = map[u][i];
flag[i] = false;
if(dist[i] == IDF)
p[i] = -;
else
p[i] = u;
}
//初始化起点
dist[u] = ;
flag[u] = true;
for (int j = ; j < n; j++) {//找n次
//从没有找到的点中找最近的
int temp = IDF;
int t = u;
for (int i = ; i < n; i++) {
if (flag[i] == false && dist[i] < temp) {
temp = dist[i];
t = i;
}
}
if (t == u) { //没有找到 原距离不变
return;
}
//更新距离 找到t点
flag[t] = true;
for (int i = ; i < n; i++) {
if (flag[i] == false && map[t][i] + dist[t] < dist[i]) {
dist[i] = map[t][i] + dist[t];
p[i] = t;
}
}
}
}
贪心算法之Dijkstra的更多相关文章
- [C++]单源最短路径:迪杰斯特拉(Dijkstra)算法(贪心算法)
1 Dijkstra算法 1.1 算法基本信息 解决问题/提出背景 单源最短路径(在带权有向图中,求从某顶点到其余各顶点的最短路径) 算法思想 贪心算法 按路径长度递增的次序,依次产生最短路径的算法 ...
- [C++]多源最短路径(带权有向图):【Floyd算法(动态规划法)】 VS n*Dijkstra算法(贪心算法)
1 Floyd算法 1.1 解决问题/提出背景 多源最短路径(带权有向图中,求每一对顶点之间的最短路径) 方案一:弗洛伊德(Floyd算法)算法 算法思想:动态规划法 时间复杂度:O(n^3) 形式上 ...
- 最短路径算法之Dijkstra算法(java实现)
前言 Dijkstra算法是最短路径算法中为人熟知的一种,是单起点全路径算法.该算法被称为是“贪心算法”的成功典范.本文接下来将尝试以最通俗的语言来介绍这个伟大的算法,并赋予java实现代码. 一.知 ...
- 求最短路径的三种算法: Ford, Dijkstra和Floyd
Bellman-Ford算法 Bellman-Ford是一种容易理解的单源最短路径算法, Bellman-Ford算法需要两个数组进行辅助: dis[i]: 存储顶点i到源点已知最短路径 path[i ...
- 单源最短路径-迪杰斯特拉算法(Dijkstra's algorithm)
Dijkstra's algorithm 迪杰斯特拉算法是目前已知的解决单源最短路径问题的最快算法. 单源(single source)最短路径,就是从一个源点出发,考察它到任意顶点所经过的边的权重之 ...
- leetcode 贪心算法
贪心算法中,是以自顶向下的方式使用最优子结构,贪心算法会先做选择,在当时看起来是最优的选择,然后再求解一个结果的子问题. 贪心算法是使所做的选择看起来都是当前最佳的,期望通过所做的局部最优选择来产生一 ...
- 贪心算法(Greedy Algorithm)
参考: 五大常用算法之三:贪心算法 算法系列:贪心算法 贪心算法详解 从零开始学贪心算法 一.基本概念: 所谓贪心算法是指,在对问题求解时,总是做出在当前看来是最好的选择.也就是说,不从整体最优上加以 ...
- 算法导论----贪心算法,删除k个数,使剩下的数字最小
先贴问题: 1个n位正整数a,删去其中的k位,得到一个新的正整数b,设计一个贪心算法,对给定的a和k得到最小的b: 一.我的想法:先看例子:a=5476579228:去掉4位,则位数n=10,k=4, ...
- LEETCODE —— Best Time to Buy and Sell Stock II [贪心算法]
Best Time to Buy and Sell Stock II Say you have an array for which the ith element is the price of a ...
随机推荐
- 设计模式:装饰器(Decorator)模式
设计模式:装饰器(Decorator)模式 一.前言 装饰器模式也是一种非常重要的模式,在Java以及程序设计中占据着重要的地位.比如Java的数据流处理,我们可能看到数据流经过不同的类的包装和 ...
- July 26th 2017 Week 30th Wednesday
A man can't ride your back unless it is bent. 你的腰不弯,别人就不能骑在你的背上. Have you ever ride a horse, or ride ...
- 有时间,可以研究哈redis的源代码
1 2 3 4 留位,以后自己用!
- mem系函数总结
memset(); 原型: void *memset(void *s, int ch, size_t n); 含义: 将s所指向的某一块内存中的每个字节的内容全部设置为ch指定的ASCII值,块的 ...
- S/4HANA生产订单的标准状态和透明工厂原型状态的映射
事务码CO03查看生产订单的状态: 从下面的界面能看出S/4HANA里生产订单在任意时刻可能存在多个状态: 生产订单的ID和状态ID的关系是1:N,维护在数据库表VSAUFK里: 如何把上述SAP系统 ...
- jemter 使用if控制器,选择需要的内容
背景:需要根据人员传入的变量,来选择运行的环境,调用不同的参数,进行拼接,使用到if控制器 取到的数据,调用的就是test1的数据
- Codeforces Round #435 (Div. 2)【A、B、C、D】
//在我对着D题发呆的时候,柴神秒掉了D题并说:这个D感觉比C题简单呀!,,我:[哭.jpg](逃 Codeforces Round #435 (Div. 2) codeforces 862 A. M ...
- UVa 1638 - Pole Arrangement(dp)
链接: https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem& ...
- 两个List中的补集
/** * 获取两个List的不同元素 * @param list1 * @param list2 * @return */ private static List getDiffrent(List ...
- NSString,NSData,NSFileManager常用方法
一.利用NSString类进行文件路径的处理 文件路径格式: NSString *path=@"/Uesrs/apple/testfile.txt" 常用方法汇总: 1.获得组成此 ...