公交最少换车次数_公交换乘最后一公里

2020-02-27 其他范文 下载本文

公交最少换车次数由刀豆文库小编整理,希望给你工作、学习、生活带来方便,猜你可能喜欢“公交换乘最后一公里”。

设一个城市有n个车站,并有m条公交线路连接这些车站,设这些公交车都是单向的,这n个车站被顺序编号为0至n-1。现要求编制程序,输入城市的公交线路数、车站个数,以及各共交线路上的站号,求站0至站n-1的最少换车次数。

程序利用输入信息构建一张有向图G,有向图的顶点是车站,若有某条公交线路经i站能到达j站,就在顶点i到顶点j之间设置一条权为1的有向边。如是这样,从站点x至站点y的最少上车次数便对应图G中从点x至点y的最短路经长度。而程序要求的换车次数就是上车次数减1。

#include #include int * buildG(int *np){ int n, m, sc, i, j, k;char ch;int *s, *g;

printf(“输入车站个数和公交线路条数:

”);

scanf(“%d%d”, &n, &m);

g =(int *)malloc(sizeof(int)*n*n);

for(i = 0;i

g[i] = 0;

s =(int *)malloc(sizeof(int)*n);

for(i = 0;i

printf(“输入第%d条公交车线路的各站编号(0

printf(”要求在线路的最后一个站号输入后紧接输入回车。n“);

sc = 0;/* 当前线路站计数器 */

ch = ' ';/* 存储站号后的字符,初态预置空格符 */

while(ch!= 'n')/* 站号后字符不是回车符循环 */

scanf(”%d%c“, &s[sc++], &ch);

for(j = 0;j

if(s[j] = n)break;

if(j

printf(”输入错误,该线路重新输入n“);i--;continue;

}

for(k = 1;k

for(j = 0;j

*(g + s[j]*n + s[k])= 1;

}

free(s);

*np = n;

return g;

}

int minLen(int *g, int n)

{ int j, k, *dist;

if(n == 0)return 0;

dist =(int *)malloc(sizeof(int)* n);/* 存储到各站的上车次数 */

for(j = 0;j

dist[j] = g[j];

dist[0] = 1;/* 若dist[i]

do { /* 每循环一次计算到一个站的换车次数 */

for(k =-1, j = 0;j

if(dist[j] > 0 &&(k ==-1 || dist[j]

k = j;

if(k

break;/* 找不到未处理的车站,或确定了n-1站的上车次数 */

dist[k] =-dist[k];/* 设置k站已求得上车次数的标记 */

for(j = 1;j

if(dist[j] >= 0 && *(g+k*n+j)&&(dist[j] == 0 ||-dist[k] + 1

dist[j] =-dist[k] + 1;

} while(1);

j = dist[n-1];

free(dist);

return k

}

void main()

{ int *g , t, n;

g = buildG(&n);

if((t = minLen(g, n))

else printf(”从0号站到%d站需换车%d次n", n-1, t);

free(g);

}

《公交最少换车次数.docx》
将本文的Word文档下载,方便收藏和打印
推荐度:
公交最少换车次数
点击下载文档
相关专题 公交换乘最后一公里 次数 公交 公交换乘最后一公里 次数 公交
[其他范文]相关推荐
    [其他范文]热门文章
      下载全文