迪杰斯特拉算法运行错误
#include <iostream>
#include<vector>
#include<string>
#include<fstream>
#include <cstdlib>//exit
using namespace std;
const int inf=999;
const int maximum=512;
int edge[30][30];
/**
1.分为两个集合
2.放到集合里,标记为1
3.再算出最短距离。
dist[]表示最短距离。
*/
void out(int n,int v,int* dist,int* pre)
{
cout<<v<<"至其他节点的最短路径为:"<<endl;
for(int i=0; i<n; i++)
{
if(i==v)continue;
vector<int> path;
cout<<i<<" "<<dist[i];
path.push_back(i);
int temp=i;
while(pre[temp]!=-1)
{
path.push_back(pre[temp]);
temp=pre[temp];
}
for(int k=path.size()-1; k>=0; k--) //通过数组size来管理。
{
cout<<"->"<<path[k];
}
}
}
void Dijsktra(int n,int v,int edge[30][30])
{
int via[n];//通过V
int dist[n];
int pre[n];
pre[v]=-1;
for(int i=0; i<n; i++)
{
dist[i]=edge[v][i];
via[i]=0;
if(edge[v][i]!=inf)
pre[i]=v;
else
pre[i]=0;
}
via[v]=1;
for(int j=1; j<n; j++)
{
int temp=inf;
int u;
for(int i=0; i<n; i++)
{
if(!via[i]&&dist[i]<temp)
{
temp=dist[i];
u=i;
}
}
via[u]=1;
for(int i=0; i<n; i++)
{
if(!via[i]&&dist[u]+edge[u][i]<dist[i])
{
dist[i]=dist[u]+edge[u][i];
pre[i]=u;//记下前驱结点
}
}
}//循环完之后就有了dist为值,path为路径
out(n,v,dist,pre);
}
int main()
{
ifstream in("test.txt");
if(!in.is_open())
{
cout<<"打开错误";
exit(1);
}
int n,m;//最大有多少个节点,节点编号从0开始,m表示有多少条边
in>>n>>m;
int x,y,cost;
for(int i=0; i<n; i++)
{
for(int j=0; j<n; j++)
{
if(i!=j)
edge[i][j]=inf;
else
edge[i][j]=0;//对角线上为0.即到自己的距离。
}
}
for(int i=0; i<m; i++)
{
in>>x>>y>>cost;
edge[x][y]=cost;
edge[y][x]=cost;
}
Dijsktra(n,0,edge);
return 0;
}
test.txt里存的内容是:
4 5
0 1 1
0 2 3
0 3 2
1 3 1
2 3 1
求大家帮助,我真的太笨了。