贪心算法之Dijkstra
2024-09-28 20:14:13
贪心算法的主要思想就是通过不断求解局部最优解,最后求出最优解或者最优解的近似值,不能保证一定为最优解。
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;
}
}
}
}
最新文章
- Shell编程基础教程2--变量和运算符
- EntityFramework Core 学习笔记 —— 包含与排除类型
- Python函数中的参数(二)
- Hibernate 根据实体名称得到DB表名以及表对应的Sequence name
- Ubuntu下如何将普通用户提升到root权限
- (转)c语言随机数srandom( )
- 关于谷歌android 4.3 ble问题
- Js 插件修改及优化总结
- ajax跨域例子
- 前两天做项目遇到了sqlserver最大连接数 Max Pool Size 的问题
- PHP中高级进阶之路
- asp.net core结合docker实现自动化获取源码、部署、更新
- COMCMS v0.9 版本发布,带前后端的一个响应式企业站
- AFNetWorking上传JSON串
- RMAN备份策略与异机恢复一例
- eclipse指定jdk路径
- pt-online-schema-change的实现原理
- activiti工作流之Eclipse的Eclipse BPMN 2.0 Designer无法安装或者(安装后无法重复打开*.bpmn)
- 如何区分slice、splice和split
- 2cmd 窗口 javac 错误:编码GBK的不可映射字符