最短路径的问题

flyingkoala 2002-10-09 02:42:00
/*问一道2000高程的考试题

题目如下:
设某城市有n个车站,并有m条公交线路连接这些车站,设这些公交车都是单向的,这n个车站被顺序编号为0至n-1. 本程序,输入该城市的公交线路数、车站个数,以及各公交线路上的各站编号,求得从站0出发乘公交车至站n-1的最少换车次数.
程序利用输入信息构建一张有向图G(用邻接矩阵g表示),有向图的顶点是车站,若有某条公交线路经i站能到达j站,就在顶点i到顶点j之间设置一条权为1的有向边<i,j>.如是这样,从站点x至站点y的最少上车次数便对应图G中从点x至点y的最短路径长度.而程序要求的换车次数就是上车次数减1.

标准的解答已经写在程序里面的
*/

#include <stdio.h>
#define M 20
#define N 50

int a[N+1];
int g[N][N];
int dist[N];
int m,n;

void buildG()
{
int i,j,k,sc,dd;
printf("输入公交线路数,公交站数\n");
scanf("%d%d",&m,&n);
for(i=0;i<n;i++)/*邻接矩阵清0*/
for(j=0;j<n;j++) g[i][j] = 0;
for(i=0;i<m;i++){
printf("沿第%d条公交车线路前进方向的各站编号(0<=编号<=%d,-1结束):\n",i+1,n-1);
sc=0;
while(1){
scanf("%d",&dd);
if(dd==-1) break;
if(dd>=0&&dd<n) a[sc++] = dd;
}
a[sc] = -1;
for(k=1;a[k]>=0;k++)
for(j=0;j<k;j++)
g[a[j]][a[k]] = 1;
}
}

int minLen()
{
int j,k;
for(j=0;j<n;j++) dist[j] = g[0][j];
dist[0] = 1; /*问题一*/
do{
for(k=-1,j=0;j<n;j++) /*找下一个最少上车次数的站*/
if(dist[j]>0&&(k==-1||dist[j]<dist[k])) k=j;
if(k<0||k==n-1) break;
dist[k] = -dist[k];/*设置k站已求得上车次数的标记*/
for(j=1;j<n;j++)/*调整经过k站能够到达的其余各站的上车次数*/
if(dist[j]>=0&&g[k][j]==1&&(dist[j]==0||-dist[k]+1<dist[j]))
dist[j] = -dist[k]+1;
}while(1);
j = dist[n-1];
return k>0?j-1:-1;
}

void main()
{
int t;
buildG();
if((t=minLen())<0)
printf("无解!\n");
else
printf("从0号站到%d站需换车%d次",n-1,t);
}


/*问题一:见minLen函数中的注释
为什么在该处要使dist[0]=1,而不是0?
若此处为1,则会造成以下的k=0(do循环中的第一个for循环)
而且在第二个循环,也就是调整经过k站到达其余各站的上车次数的循环的if判断条件中的
g[k][j]实际上就是g[0][j],而这已经在最开始赋值过了
这好象又会造成调整无效
从而在第二轮循环中寻找下一个最少上车次数的站(do循环中的第一个for循环)中的
dist[j]>0&&(k==-1||dist[j]<dist[k])不可能满足---k等于0,disk[0]=-1
所以这肯定会造成死循环。... ...我迷糊了:)

希望知情者告知
*/
...全文
41 1 打赏 收藏 转发到动态 举报
写回复
用AI写文章
1 条回复
切换为时间正序
请发表友善的回复…
发表回复
ewang_365 2002-10-09
  • 打赏
  • 举报
回复
dist[0]=1表示是从0站到达后面各站,如果dist[0]=0,表示0站无法到达后面站,我想是这样,就是说dist[0]=1标志是从0站到达各站的意思。

2,948

社区成员

发帖
与我相关
我的任务
社区描述
就计算机等级考试、软件初、中、高级不同级别资格考试相关话题交流经验,共享资源。
c1认证c4javac4前端 技术论坛(原bbs)
社区管理员
  • 软件水平考试社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧