哪位神犇能帮我看看这个婴儿版带提示(有中文输出,便于查看各数据变化)的Dijkstra单源最短路径算法有没有什么问题
思路来源于《信息学奥赛一本通》c++第五版P476~478
本蒟蒻第一次整这么高级的活不喜勿喷(求)
dis[ ]存着从起点到下标节点最短距离
pre[ ]存着下标节点的前驱
w[ ][ ]存着从一个节点到另一个节点的距离
vis[ ]存着该下标节点有没有被访问
start存着起始节点
end存着结束(目标)节点
u,v输入距离用的
mi循环找与起点距离最小的节点与起点的距离
nodenum节点数量
way存储最短路径
p,wa辅助存储最短路径
#include <bits/stdc++.h>
using namespace std;
int dis[1000],pre[1000],w[1000][1000]={-1},n,u,v,start,end,mi=1000000,nodenum=-1,way[1000],p,wa=1;
bool vis[1000];
void Dijkstra()
{
dis[start]=0;
pre[start]=0;
//vis[start]=1;
for(int i=1;i<=nodenum;i++)
{
if(i==end)return;
mi=1000000;
for(int j=1;j<=nodenum;j++)
if(dis[j]<mi&&vis[j]==0)
mi=j;
cout<<"以节点"<<i<<"为起始点"<<endl;
for(int j=1;j<=nodenum;j++)
{
if(w[mi][j]!=0&&vis[j]!=0)
{
dis[j]=dis[mi]+w[mi][j];
vis[j]=1;
cout<<" 修改:"<<j<<"的前驱原为"<<pre[j]<<",现改为"<<mi<<endl;
pre[j]=mi;
}
if(dis[i]+w[i][j]<dis[j]&&w[i][j]!=0)
{
cout<<" 修改:起点到"<<j<<"的距离原为"<<dis[j]<<",现改为"<<dis[i]+w[i][j]<<endl;
dis[j]=dis[i]+w[i][j];
vis[j]=1;
cout<<" 修改:"<<j<<"的前驱原为"<<pre[j]<<",现改为"<<i<<endl;
pre[j]=i;
}
}
cout<<" 节点"<<i<<"的前驱为"<<pre[i]<<endl;
}
}
int main()
{
cout<<"输入边数量:";
cin>>n;
for(int i=1; i<=n; i++)
dis[i]=0x7fffffff,vis[i]=0;
cout<<"输入节点到节点的距离"<<endl<<"格式:节点1 节点2 距离"<<endl;
for(int i=1;i<=n;i++)
{
cin>>u>>v;
if(u>nodenum)nodenum=u;
if(v>nodenum)nodenum=v;
cin>>w[u][v];
}
cout<<"起点:";
cin>>start;
cout<<"终点:";
cin>>end;
cout<<"--------------以下为运算过程--------------"<<endl;
Dijkstra();
way[1]=p=end;
while(pre[p]!=0)
{
way[wa]=pre[p];
p=pre[p];
wa++;
}
cout<<endl<<endl<<"----------------以下为答案----------------"<<endl;
cout<<"以"<<start<<"为起点,"<<end<<"为终点的单源最短路径中"<<endl<<" 路径:";
for(int i=wa-1;i>=1;i--)cout<<way[i]<<"-";
cout<<end<<endl<<" 距离:"<<dis[end];
return 0;
}
帮我检查检查,万分感谢!