Dijkstra算法的简单应用

LostOmato 2014-12-05 12:02:53




#include<iostream>
using namespace std;

int min(int Vlength[],int n){//返回数组中最小非零元素的下标
int min=100;
int j=0;
for(int i=0;i<n;i++){
if(Vlength[i]<min&&Vlength[i]>=0){
min=Vlength[i];
j=i;
}
}
return j;
}
int main(){
int Vnumber,minL=0,sum;//minL用来记录当前可达节点中最小的一个的长度 sum用来判断 VLength[]的和为-9
int Length[9][9];
for (int i=0;i<9;i++)
for(int j=0;j<9;j++)
Length[i][j]=-1;
for (int i=0;i<9;i++)
Length[i][i]=0;
Length[0][1]=4;Length[0][2]=2;Length[0][4]=2;Length[0][5]=1;Length[1][2]=1;Length[2][3]=7;Length[3][4]=15;Length[4][5]=10;Length[4][6]=5;Length[5][7]=11;Length[7][8]=5;
char Vname[]={'a','b','c','d','e','f','g','h','i'};
int VLength[]={0,-1,-1,-1,-1,-1,-1,-1,-1,};//当前长度
int VLength_R[]={-1,-1,-1,-1,-1,-1,-1,-1,-1};//真实路径长度
for(int j=0;;j++){
for(int i=0;i<9;i++){
// VLength[i]=a[j][i];
if(VLength[minL]+Length[minL][i]>VLength_R[i]&&Length[minL][i]>0)
VLength[i]=VLength[minL]+Length[minL][i];

//如果大于0则把结果赋值到VLength_R中
if(VLength[i]>=0)
VLength_R[i]=VLength[i];
}
minL=min(VLength,9); //获取当前路径最短节点的下标

VLength[minL]=-1; //将最短长度标记为负
minL=min(VLength,9);// 获取下一个最短长度
cout<<"当前距离原点最近的节点长度为:"<<minL<<endl;
cout<<"当前可达节点中最小的一个的长度:"<<VLength[minL]<<endl;
//判断当Vlength[]中元素都为-1时跳出循环
sum=0;
for(int i=0;i<9;i++)
sum+=VLength[i];
if(sum==-9)
break;
}
// for(int i=0;i<9;i++)
// cout<<VLength[i]<<endl;
cout<<"原点到各点的最长距离"<<endl;
for(int i=0;i<9;i++)
cout<<VLength_R[i]<<endl;
return 0;
}


看道题目就想用求最短路的思路来求解。后来看答案就是Dijkstra算法。
先将题目抽象成一个有向图。之后将最短路的算法改成了求最长路。
但总觉得代码写的怪怪的。
但是能正常求得结果
求大牛指导
先提两个问题
1.邻接矩阵的表示方法是否合适?除了开二维数组有没有更好的方法。
2.Dijkstra算法是否存在问题。感觉在第二次循环的地方有冗余的计算。
...全文
149 1 打赏 收藏 转发到动态 举报
写回复
用AI写文章
1 条回复
切换为时间正序
请发表友善的回复…
发表回复
bear234 2014-12-05
  • 打赏
  • 举报
回复
图可以有两种表示方式: 一种是邻接矩阵 另外一种就是链表-----一个数组 每个元素都是一个结点 同时每个元素都有一个指针指向它的邻居(即链表形式) 我个人比较喜欢第二种 不过两种的复杂度都一样 这个算法实现的时候一定会用到一个嵌套的循环 无法避免 具体到底有没有冗余 自己判断吧

64,637

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧