数学建模社区-数学中国

标题: 公交路线最小换乘次数的路径选择算法(C代码)(请求高手指教) [打印本页]

作者: 舞情_Dong    时间: 2012-8-19 18:02
标题: 公交路线最小换乘次数的路径选择算法(C代码)(请求高手指教)
第三天了,关于交通路线的选择,用C语言写成了个样子,下面代码可以正常运行,就是路线选择的结果不是很好,结果有好多重复的,有些站点似乎选不出来,这和存放交通路线的数组a有关,我们是把公交路线的上行和下行放在二维数组的同一行的,肯定有重复,但对程序算法也有质疑,实在是惭愧,自己不才,对其它语法实在是不太了解,用的都是for,if循环嵌套,还请仁兄指教。这是2007年的全国竞赛题,网上也有各种算法(基于不同语言),我们建模培训做真题,按自己想法用C编写了下面的程序,但结果不是很好,自己对其它的语句又不是很了解,实在没辙了,真心请教各位大侠,现在在改数组,打算将同一条交通路线的上行和下行放入数组的不同行里,真心寻求帮助,请求仁兄指导,谢谢!7 p( g9 Z( m0 h
& w" b" G2 p2 K7 l4 }
  J1 N; N0 U! [; l- E4 ~/ ~9 ]
编写的C代码如下,由于数组a的数据带大,粘贴不过来(520条数据)$ p+ y; s2 d( ^" \  k
本人实在是很惭愧,对C其他语法语句不是很熟悉,用的全是for,if循环嵌套,还请仁兄耐心查看1 U2 A7 I# T  j* ~5 p: f
% m5 s; a6 }! }( v! Z
* ^) t) C. c2 _6 n" i" l
        uint value1,value2;
7 c8 ?' y8 P" B" Q% D9 x        uint a[200],a1[200];//定义一个数组
7 g" g& h& P6 N, b$ B        uint b[200],b1[200];1 F3 y1 F- M8 n3 [7 L* _; k2 ]% g% w
    uint c[200];4 ?( W' O1 a/ ^* Z$ y2 R" d5 f

* m" U4 {5 a+ N; {; A& E
9 ~- h5 E# _7 f8 _$ |( x, l/ K
; {: y8 H" }+ O! H1 Mvoid routes()7 [( x4 h$ `2 x2 l9 o* p
{3 `3 }* e7 E) u& H! X" q
       
2 E, l& Q3 J8 y8 I        uint i,j,j1,j2,j3,j4,c1,c2,k=0,k1=0,k2=0;
* y- v- D6 @; |6 P# v7 i; Y        uint linshi1,linshi2,e=0,f=0;
/ Y* x0 {7 F1 D4 V+ w" a. K1 H* H        uint q1,q2,q3,t;& }3 u8 k0 V( [) P1 g) q) R
        uint luxian1=0;$ j7 E  q# l: ?
        uint m=0;7 s1 |( m6 M4 f8 f. S5 r* F& ]
        uint n=0;* k0 G8 T* ^- K/ s$ w6 y
        for(i=0;i<520;i++)
% e5 C" I8 v* [0 ?9 R: M. h' L        {
$ h. r; n: I6 D+ d) f; _                for(j=0;j<200;j++)
: ~5 o0 z: k) |" k+ F- C                {9 m! G) ]! m9 P
                        if(y[i][j]==value1)//寻找包含起点的所有路线,将路线值放入数组a
: w( n4 d2 `, P1 O, p) d# v* P                        {
& P5 I* \3 c* N                                a[m]=i;
, P5 ]$ b' {. ~, s! ]; I& L8 E                                //a1[m]=j;
1 \+ f# M6 U# K4 |, J! ~/ c8 I                                m++;
, u. \5 |% d- `+ V. \% D                        }% l! e& l3 U; u, O6 ~6 A
                        if(y[i][j]==value2)//寻找包含终点的所有路线,将其放入数组b
+ q$ b$ g5 E. t9 O2 k                        {( P% n0 k) i+ Y+ f1 v" g
                                b[n]=i;
, ~+ m/ G, N4 h2 q7 V; a                                //b1[n]=j;
* e" ~+ ^; J# u: ?( _+ O; i& N* o# X                                n++;+ p9 S( `, u6 U7 k# m0 g$ B
                        }8 Q! W4 ^, O4 C$ N+ {
                }               
6 b! y" K* j* u4 j6 s! T0 M, Q! b0 J% o        }
; u" A( B8 Z$ S( s) X. m6 u        printf("所有经过起点的路线a为:");) }0 e+ t, S4 {5 Y
        for(i=0;i<m;i++)
6 g7 j3 r$ b6 |2 C7 [        {
, \, v; [/ S+ g+ l. J                printf("%d  ",a[i]);               
0 C- W9 o- ?( U) O) x        }1 }: t! i' ^1 n; |1 h( V' A8 `
        printf("\n");
! J  g% n$ Q# d        printf("所有经过终点的路线b为:");' x7 P; e: t" k" o; n1 ]2 f# k
        for(i=0;i<n;i++)7 U5 \0 u, _0 n6 Q
        {
" D# }6 E# m+ u, o- {% d, x                printf("%d  ",b[i]);               
, P' n) F, ^9 w8 J+ u        }* x0 [9 k" `+ ]/ V) q  k% p0 C5 C
        printf("\n");
! @$ L( e, y: B: ^1 @: h, C; e: X5 i4 Z6 ]" r6 W" ^3 t4 r9 B

: A9 ^. _4 X' z2 h" Z6 k
: ~9 z! C; v. _4 ~        for(i=0;i<m;i++)//直达路线的寻找  _8 @/ B1 I# h6 I- s# }# V
        {/ _0 l: {- A6 p+ ^, T
                for(j=0;j<n;j++)
1 V4 [, v" k) y3 c" p                {
3 d- n8 |* l2 o' J" e8 m$ U" K3 i7 \# N                        if(a[i]==b[j])6 I9 b, G* D/ V: u. w% B
                        {
* g; g- J1 f" J6 M8 P                                c[k]=a[i];  H5 f4 y0 ^6 A, K$ V3 h; G! r' E
                                k++;                                        , v- C% ^/ e) `3 E( E  v
                        }4 N9 b# k, H, j& B! R
                }
5 e$ a. x5 b" ?! d( u) K! p        }
, U/ _/ ^8 N7 C2 h: U        printf("您查询的站点的直达路线有:");
2 ~4 }- q; o- _6 y* K( B0 U5 E        for(i=0;i<k;i++)9 f. |9 M4 }" y
        {* }2 f& r) i/ d* G
                if(c[i]!=0)" {4 l* {! A* ~8 w+ k% ]6 |; e
                printf("%d  ",c[i]);7 I$ {9 ^. a" }
        }
7 X: d9 r7 N% o% V+ A! G! h. L4 P5 x        printf("\n");//若没有直达路线这数组c为零,接着下面转乘一次路线的寻找5 `2 H8 T3 D* f; y/ K8 a0 _2 H
- Z# b3 Y; O) Q) O1 h1 p

) q" t, I4 Z5 k  q        if(k==0)
( s# o9 X0 }: `# j        {/ ^; ]" J7 I/ [. U/ w8 x, a
                for(c1=0;c1<m;c1++)//转乘一次路线的寻找
4 B# \2 h$ r* d; |' B                {
5 f: J# u! u2 _/ ~                        for(j=0;j<200;j++)3 K; ^6 r2 W: q7 B
                        {. L: x, s  E. k9 O. r
                                linshi1=a[c1];
0 g1 m) n- e& {, r+ w: v+ c                                k1=y[linshi1][j];//取出a中每一条路线上每一个站点,接着与b中站点进行比较,查询公共点。4 D6 t0 |8 `1 d4 e
                                for(c2=0;c2<n;c2++)
) ]# v3 R# E7 X5 l6 k9 |9 V) Y                                {) Z' S$ g$ Q2 E/ b  b9 b
                                        for(j=0;j<200;j++)//该算法不是很好,j小于200时还得往后遍历。
. s& Y' B9 \. W- [                                        {! L* i$ W0 m* \' m: t; ~
                                                linshi2=b[c2];" J8 Z, H! t# P' t& b5 R0 _
                                                k2=y[linshi2][j];//将b中的站点取出与k1进行比较判断。
7 D1 g# [; f, W% a3 A                                                if(k1==k2/*||k1==k2+1||k1==k2-1*/&&(k1!=0)&&(linshi1!=0)&&(linshi2!=0))//寻找数组a,b中的站点,有相同的及为转乘一次的转乘点,并输出。
- m4 j0 n7 a: L" x                                                {" k' g5 ]5 t+ m- X7 y+ {6 z
                                                        printf("您可以转乘一次,起始路线为:%d ,中间转站点为:%d ,%d终点路线为:%d\n",linshi1,k1,k2,linshi2);: t- m% ]* t* S+ w  n0 m' i- U, \
                                                        luxian1++;
- y& N% k" e/ e/ {# x' t! y$ L3 e                                                }
. ^5 J. }. W. o- ~! \                                        }                               
7 z/ G2 O( f6 J$ f  U0 F                                 }        ' Z: p, r) Q! B6 ^
                        }        
% ?" Q8 x6 B* i" o7 u/ t; Q                }1 n% F7 t! _* ^4 u5 p8 ~' x
        }  ]5 [$ _& V. V+ o& @/ s
- P6 e# t& f/ N0 P

* w& W4 }$ ~0 y# u+ h        if(luxian1==0&&k==0)
+ a; Y* t* C! r: T: a* h        {
- Y4 X; F; r8 f( b                for(c1=0;c1<m;c1++)//转乘两次路线的寻找
0 y) m; A6 L8 e1 g$ Z) p                {
2 t* O' V  C% |1 T9 c$ F9 U                        for(j=0;j<200;j++)
- B0 u' d7 I; e0 N* T                        {/ s9 U9 l; u$ f( D+ R. ^4 A$ `
                                linshi1=a[c1];
1 O. r# {, h6 @' k" e, q                                k1=y[linshi1][j];//取出a中每一条路线上每一个站点,接着与b中站点进行比较,查询公共点。
2 [0 {7 X6 q' D) w                                for(c2=0;c2<n;c2++)
3 \, J- G' J1 W! R# y                                {7 W! `9 U. c! ^5 P+ f6 P
                                        for(j=0;j<200;j++)//该算法不是很好,j小于200时还得往后遍历。
& w6 f- B, [; Y1 }$ z: u; F                                        {& @5 [* o4 |4 C0 g  w& p: X6 s
                                                linshi2=b[c2];
, s5 \7 Z* h4 [  j                                                k2=y[linshi2][j];//将b中的站点取出与k1进行比较判断。
; G% j. o" S! j* T9 e& J# i                                                for(i=0;i<520;i++)
* n: U8 `4 D7 _7 S/ r                                                        {
; s% ?6 d0 ?( P+ q2 Y  L                                                                for(j=0;j<200;j++)
( [; [3 S4 L, P! R0 {0 F                                                                {
4 b# G/ Z! i* y/ {0 M8 C                                                                if(k1==y[i][j]&&k1!=0)- u/ r# x- Y/ V1 G7 |! a
                                                                {
' |2 o  m8 e9 o0 d* r                                                                        f=i;
7 v9 O! }( t8 T' a) L                                                                        e=j;                                                               
" c; i: W+ M4 j& ~7 E! j                                                                        for(j=0;j<200;j++)
( U. j6 y) T8 P0 n, o2 Z5 ]                                                                        {
" j/ |$ h2 X2 j9 X8 t. @7 X                                                                                if(k2==y[i][j]&&k2!=0&&(e<j)&&(linshi1!=0)&&(linshi2!=0))
+ s5 Q% U5 t) \* G$ j                                                                                {
' N  B) |+ q/ \3 g                                                                                        printf("您需转乘两次,起始路线为:%d ,第一个转车站点为:%d,中间路线为:%d,第二个转车站点为:%d,终点路线为:%d\n",linshi1,y[i][e],f,y[i][j],linshi2);: |; E# p8 ?' K4 H* v+ F
                                                                                        //q1=abs(e-a1[c1]);//计算每条路线上经过的站点数  H3 u1 b( c& ]  U$ C
                                                                                        //q2=abs(j-e);
8 F$ l- A" S% q1 I$ z" z                                                                                        //q3=abs(b1[c2]-j);: v  p1 i+ M' G: z: A
                                                                                        //t=3*(q1+q2+q3)+10;
+ B1 u4 R+ D# H* k2 r                                                                                        //printf("该路线总共计时为:%d 分钟\n",t);
  H/ j7 z3 k( R8 a2 J' N                                                                                }
8 S  c; @5 X, W, ]* p                                                                        }
8 z9 _, |4 O" M. f                                                                }' Z) f8 I( z' a( g( X
                                                                }
4 h4 G2 [- I2 c* `% ]                                                        }    4 l& t# W: P5 t2 X, \. I
                                        }       
' w: }, J" q9 @* `& x                                }( p$ S- t$ t  X6 `8 \8 d9 M9 i2 E
                        }& f* \: p3 P$ E  D; G
) S/ Q! J  m: W# t
                }
& D8 K) v3 T+ o" c        }6 s. F3 G7 \6 d8 P* M5 V( p. G
" n1 V$ O' N3 J" j' ^" E0 B
6 d+ \+ Q1 m7 |; J& ]; r0 a6 m

1 v% w' U* P# `/ k6 ]+ s6 t1 G. M

0 @+ @6 F) }2 c! M& w, b6 e
0 R$ A0 n6 A. P' C- X  s0 Q, p$ ~5 L
4 O$ e& Y8 ]  ~

$ }2 v7 f: Q( R+ t- N( J4 E5 d8 c' G3 S+ o) w8 |
7 i& b9 m) ^3 r% ^& _8 W6 {* q+ L
2 J5 P# N0 C7 X- r  g
}: ^& E, N" s. @7 e+ V
: @  R5 M4 `( Z" v$ b. ?7 |
        void main()# ^4 }; X, U# C. @( O
        {6 f( F( L+ T1 a6 K
                printf("请输入起始站点和终止站点(中间空格间开): \n");! E* s! `+ ^, t2 }
                scanf("%d %d",&value1,&value2);               
4 @4 {. U) Y; g5 w& ?3 _0 |                routes();/ ^) o  r- w, e% A0 I2 q
  A; |# H2 t, a  v( N
        }
5 T5 z7 W! I% y       
作者: huakaibubai    时间: 2012-8-20 09:01
顶!!!!!!!!!
作者: huakaibubai    时间: 2012-8-20 09:01
好好!!!
作者: 倦了流年    时间: 2014-7-14 00:29
顶一个先!!!!!!!




欢迎光临 数学建模社区-数学中国 (http://www.madio.net/) Powered by Discuz! X2.5