| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 379 人关注过本帖
标题:可否帮忙?真的迫切需要,谢谢
只看楼主 加入收藏
鬼才!
Rank: 1
等 级:新手上路
帖 子:19
专家分:0
注 册:2013-10-21
结帖率:25%
收藏
已结贴  问题点数:15 回复次数:2 
可否帮忙?真的迫切需要,谢谢
这是求最短路的程序,我查了好几遍,觉得思路没问题,但怎么就是输不出我想要的结果呢?

/*我的思路是:
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;

}
}


}
图片附件: 游客没有浏览图片的权限,请 登录注册
2013-11-11 23:17
wu2782641803
Rank: 2
等 级:论坛游民
帖 子:65
专家分:46
注 册:2013-10-28
收藏
得分:15 
回复 楼主 鬼才!
图片附件: 游客没有浏览图片的权限,请 登录注册
我好像在VC6.0可以输出!你看看是不是这个结果
2013-11-12 08:08
鬼才!
Rank: 1
等 级:新手上路
帖 子:19
专家分:0
注 册:2013-10-21
收藏
得分:0 
回复 2楼 wu2782641803
我输出的也是这个结果啊,但是结果不对,好像值压根就没有存进L[a]一样。
2013-11-12 12:35
快速回复:可否帮忙?真的迫切需要,谢谢
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.027832 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved