关于最短路径的算法问题
// 数据算法中的最短路径算法.cpp : Defines the entry point for the console application.
//
#include "stdafx.h"
#include "iostream.h"
const int n= 6; // 图中顶点数
const int e=8 ; // 图中边数
const int max=9999;
struct graph
{
int V[n+1] ; // 存放顶点信息v1,v2,….vn,不使用v[0]存储空间
int arcs[n+1][n+1] ; // 邻接矩阵
};
struct record{ //每个顶点的数据结构设置为一个数组队列
int number; //顶点号
int flag; //标志是否从队列中被选过如果为1表示选过为0表示未选
int allpath; //从源点到这个点的当前最短距离(权最小)
int v_p; //表示顶点n的前一个顶点,比如path[i].v_p表示最短路径中顶点i的前一个顶点,
//0表示前面没有前一个顶点
}path[n+1];
void creatadj(graph &g)
{ int i, j,k ,distance;
int min=9999;
cout<<"请输入顶点序号"<<endl;
for (k=1; k<=n; k++)
cin>>g.V[k];//输入顶点信息
for (i=1; i<=n; i++ )
for (j=1; j<=n; j++)
g.arcs[i][j]=max;
cout<<"请输入边及其边上的权,输入格式为(边的一个端点i 另一个端点j 边上的权distance)"<<endl;
for (k=1; k<=e; k++)
{
cin>>i>>j>>distance; //输入一条边(i,j)
g.arcs[i][j]=distance;
g.arcs[j][i]=distance;
}
}
void dijkstara(graph &g)
{ int i,m,j,mint=0,minnumber;
int min=9999;
int k,s,t;//源点的上一个点为k,源点为s,需要加入的点为t
cout<<"请输入源点s"<<endl;
cin>>s;
for(i=1;i<=n;i++)
{if(i==s)
{ path[i].flag=1;
path[i].allpath=0;
path[i].v_p=0;}
else
{path[i].allpath=max;
path[i].flag=0;
path[i].number=i;
path[i].v_p=0;}
}//end for end if
for(i=1;i<=n;i++)
{for(m=1;m<=n;m++)
if(path[m].allpath<min&&path[m].flag==0)//选出一个具有最值的点
min=path[m].allpath;
minnumber=path[m].number;
path[i-1].v_p=minnumber;
path[minnumber].flag=1;
for(i=1;i<=n;i++)//进行类似广度优先搜索,更新最短路径
{if((i!=minnumber) &&path[i].flag!=1)
path[i].allpath=path[minnumber].allpath+g.arcs[minnumber][i];
}//end if and end for
}//end for
cout<<"最短路径长度(权)为"<<endl;
for(j=1;j<=n;j++)
cout<<path[j].allpath<<" "<<path[i].v_p<<endl;
}
int main(int argc, char* argv[])
{
struct graph g={{0,1,2,3,4,5,6},{
{max,max,max,max,max,max,max},
{max,0,2,max,max,max,5},
{max,2,0,6,max,max,9},
{max,max,6,0,8,10,4},
{max,max,max,8,max,max,max},
{max,max,max,10,max,0,7},
{max,5,9,4,max,7,0}}};
// creatadj(g);
dijkstara(g);
return 0;
}
我看书上最短路径的算法DIJKSTRA,自己写了下程序,
其他函数好象没什么问题,估计问题应该在void dijkstara(graph &g)中
但我感觉就是安算法写出来的,就是运行不正确
主函数中的赋值是为了方便调程序写的,程序正确了就用creatadj(g);,这个函数没问题,都能通过,要能帮我改下void dijkstara(graph &g)的吗?
谢谢了