可否帮忙?真的迫切需要,谢谢
这是求最短路的程序,我查了好几遍,觉得思路没问题,但怎么就是输不出我想要的结果呢?/*我的思路是:
1)先将图转换成邻接矩阵,将不能到达的两个点之间距离用m表示,表示这两点不能到达。
矩阵第一排表示原点1到各个点的距离,同理,第二排表示2点到其余点的距离,依次表示点3,4等等。
2)假设先求原点1到9的最短距离,先从第一排开始,如果第一排有个值不等于m,接下来假设这个值为C[0][i],
如果i等于8,则表示1点有直接指向9的弧,将这个值存入L[a],再求别的C[0][i]并且a++;
3)若i不等于k,再求i+1那排的值,假设为C[i][j],若j等于k,就将C[0][i]+C[i][j]存入L[a]并且再a++,
4)若j不等于k,再求k+1那排的值,然后同理到第1)步
5)再将存入L[a]里值用冒泡排序法排出大小,数组里第一个便是最短距离,再用switch输出路径
5)然后同理求1到其余点的最短距离,k+1表示所要求的那个点,由于1到1的点不用求,所以直接从1到2开始算,
但是会用到很多循环语句。
*/
#include<iostream>
using namespace std;
#include <iomanip>
#define m 1000 //表示两点间不可达,距离为无穷远
#define n 9 //结点的数目
void dijkstra(int C[][n],int v);//求原点v到其余顶点的最短路径及其长度
void main()
{
cout<<" ——Dijkstra算法的程序实现——"<<endl;
int C[n][n]={
{m,3,5,20,26,4,m,m,m},
{4,m,m,5,4,m,20,m,m},
{9,m,m,m,4,8,m,m,m},
{18,4,m,m,m,m,9,m,25},
{20,2,6,m,m,m,7,8,30},
{5,m,3,m,m,m,m,m,30},
{m,5,m,5,1,m,m,m,25},
{m,m,4,m,6,2,m,m,10},
{m,m,m,m,25,m,4,9,m}
};
int i,j;
int v = 1;
cout<<"输出有向图的邻接矩阵"<<endl;
for(i=0;i<n;i++)
{
for(j=0;j<n;j++)
{
cout<<setw(6)<<C[i][j] ;
}
cout<<endl;
}
cout<<"输出原点1到其他各点的最短路径及其长度"<<endl;
dijkstra(C,v);
}
void dijkstra(int C[][n],int v)
{
int i,j,k,l,p,q,u,y,s,w;
int a = 0;
int flag;
int L[10];//存储从1点到k+1点的距离
cout<<"原点1到1点的最短距离为0";
cout<<"路径为:"<<"1"<<"-->"<<"1";
cout<<endl;
for(k=1;k<9;k++)
{
for(i=0;i<n;i++)//查找第1排
{
if(C[0][i] != m)
{
if(i=k)
{
L[a]=C[0][i];
a++;
flag=1;
break;
}
else
{
for(j=0;j<n;j++)//查找第2排
{
if(C[i][j] != m)
{
if(j=k)
{
L[a]=C[0][i]+C[i][j];
a++;
flag=2;
break;
}
else
{
for(l=0;l<n;l++)//查找第3排
{
if(C[j][l] != m)
{
if(l=k)
{
L[a]=C[0][i]+C[i][j]+C[j][l];
a++;
flag=3;
break;
}
else
{
for(p=0;p<n;p++)//查找第4排
{
if(C[l][p] != m)
{
if(p=k)
{
L[a]=C[0][i]+C[i][j]+C[j][l]+C[l][p];
a++;
flag=4;
break;
}
else
{
for(q=0;q<n;q++)//查找第5排
{
if(C[p][q] != m)
{
if(q=k)
{
L[a]=C[0][i]+C[i][j]+C[j][l]+C[l][p]+C[p][q];
a++;
flag=5;
break;
}
else
{
for(u=0;u<n;u++)//查找第6排
{
if(C[q][u] != m)
{
if(u=k)
{
L[a]=C[0][i]+C[i][j]+C[j][l]+C[l][p]+C[p][q]+C[q][u];
a++;
flag=6;
break;
}
else
{
for(y=0;y<n;y++)//查找第7排
{
if(C[u][y] != m)
{
if(y=k)
{
L[a]=C[0][i]+C[i][j]+C[j][l]+C[l][p]+C[p][q]+C[q][u]+C[u][y];
a++;
flag=7;
break;
}
else
{
for(s=0;s<n;s++)//查找第8排
{
if(C[y][s] != m)
{
if(s=k)
{
L[a]=C[0][i]+C[i][j]+C[j][l]+C[l][p]+C[p][q]+C[q][u]+C[u][y]+C[y][s];
a++;
flag=8;
break;
}
else
{
for(w=0;w<n;w++)//查找第9排
{
if(C[s][w] != m)
{
if(w=k)
{
L[a]=C[0][i]+C[i][j]+C[j][l]+C[l][p]+C[p][q]+C[q][u]+C[u][y]+C[y][s]+C[s][w];
a++;
flag=9;
break;
}
else
{
break;
}
}
}
}
}
}
}
}
}
}
}
}
}
}
}
}
}
}
}
}
}
}
}
}
}
}
}
int tmp;
int x,z;
for(x=0; x < a; x++)
{
for(z=0;z < a-x; z++)
{
if(L[z]>L[z+1])
{
tmp = L[z];
L[z]= L[z+1];
L[z+1]=tmp;
}
}
}
cout<<"原点1到"<<k+1<<"点的最短距离为"<<L[0];
i++;
j++;
l++;
p++;
q++;
u++;
y++;
s++;
w++;
/*if(flag = 1)
cout<<"路径为:1-->"<<i<<endl;
else if(flag = 2)
cout<<"路径为:1-->"<<i<<"-->"<<j<<endl;
else if(flag = 3)
cout<<"路径为:1-->"<<i<<"-->"<<j<<"-->"<<l<<endl;
else if(flag = 4)
cout<<"路径为:1-->"<<i<<"-->"<<j<<"-->"<<l<<"-->"<<p<<endl;
else if(flag = 5)
cout<<"路径为:1-->"<<i<<"-->"<<j<<"-->"<<l<<"-->"<<p<<"-->"<<q<<endl;
else if(flag = 6)
cout<<"路径为:1-->"<<i<<"-->"<<j<<"-->"<<l<<"-->"<<p<<"-->"<<q<<"-->"<<u<<endl;
else if(flag = 7)
cout<<"路径为:1-->"<<i<<"-->"<<j<<"-->"<<l<<"-->"<<p<<"-->"<<q<<"-->"<<u<<"-->"<<y<<endl;
else if(flag = 8)
cout<<"路径为:1-->"<<i<<"-->"<<j<<"-->"<<l<<"-->"<<p<<"-->"<<q<<"-->"<<u<<"-->"<<y<<"-->"<<s<<endl;
else if(flag = 9)
cout<<"路径为:1-->"<<i<<"-->"<<j<<"-->"<<l<<"-->"<<p<<"-->"<<q<<"-->"<<u<<"-->"<<y<<"-->"<<s<<"-->"<<w<<endl;*/
switch (flag)
{
case 1 :cout<<"路径为:1-->"<<i<<endl;
break;
case 2 :cout<<"路径为:1-->"<<i<<"-->"<<j<<endl;
break;
case 3 :cout<<"路径为:1-->"<<i<<"-->"<<j<<"-->"<<l<<endl;
break;
case 4 :cout<<"路径为:1-->"<<i<<"-->"<<j<<"-->"<<l<<"-->"<<p<<endl;
break;
case 5 :cout<<"路径为:1-->"<<i<<"-->"<<j<<"-->"<<l<<"-->"<<p<<"-->"<<q<<endl;
break;
case 6 :cout<<"路径为:1-->"<<i<<"-->"<<j<<"-->"<<l<<"-->"<<p<<"-->"<<q<<"-->"<<u<<endl;
break;
case 7 :cout<<"路径为:1-->"<<i<<"-->"<<j<<"-->"<<l<<"-->"<<p<<"-->"<<q<<"-->"<<u<<"-->"<<y<<endl;
break;
case 8 :cout<<"路径为:1-->"<<i<<"-->"<<j<<"-->"<<l<<"-->"<<p<<"-->"<<q<<"-->"<<u<<"-->"<<y<<"-->"<<s<<endl;
break;
case 9 :cout<<"路径为:1-->"<<i<<"-->"<<j<<"-->"<<l<<"-->"<<p<<"-->"<<q<<"-->"<<u<<"-->"<<y<<"-->"<<s<<"-->"<<w<<endl;
break;
default :break;
}
}
}