数学建模社区-数学中国

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

作者: 舞情_Dong    时间: 2012-8-19 18:02
标题: 公交路线最小换乘次数的路径选择算法(C代码)(请求高手指教)
第三天了,关于交通路线的选择,用C语言写成了个样子,下面代码可以正常运行,就是路线选择的结果不是很好,结果有好多重复的,有些站点似乎选不出来,这和存放交通路线的数组a有关,我们是把公交路线的上行和下行放在二维数组的同一行的,肯定有重复,但对程序算法也有质疑,实在是惭愧,自己不才,对其它语法实在是不太了解,用的都是for,if循环嵌套,还请仁兄指教。这是2007年的全国竞赛题,网上也有各种算法(基于不同语言),我们建模培训做真题,按自己想法用C编写了下面的程序,但结果不是很好,自己对其它的语句又不是很了解,实在没辙了,真心请教各位大侠,现在在改数组,打算将同一条交通路线的上行和下行放入数组的不同行里,真心寻求帮助,请求仁兄指导,谢谢!9 `$ {: [8 O& D( b; j, r

6 v. N1 H4 N6 T. r
: R! h9 r( q7 D( r# r编写的C代码如下,由于数组a的数据带大,粘贴不过来(520条数据)' `9 \& s) R: o$ B" A8 k3 m
本人实在是很惭愧,对C其他语法语句不是很熟悉,用的全是for,if循环嵌套,还请仁兄耐心查看' J4 J  c5 l. z0 S& q3 B, j
* e1 L- L% h; F7 o( B$ S* v9 f

# X6 g) T9 u6 w' l. ?2 U         uint value1,value2;- C) I# u* Y9 h
        uint a[200],a1[200];//定义一个数组/ i# n! |7 \" P" i1 n& b
        uint b[200],b1[200];
; Z( l, D" q5 l  n    uint c[200];
5 E& i* O; g5 ?. J; Z3 l$ V7 O6 b
# D: U: ?: |; F) U" E, A1 j

5 n! A6 x  T0 M$ C. q/ Bvoid routes()
1 F  ]2 ?( V5 R+ ]" Z{* m3 `1 c0 }9 C8 y5 J
        # I6 L6 x, `, b1 ~. K
        uint i,j,j1,j2,j3,j4,c1,c2,k=0,k1=0,k2=0;
" ]: g# z3 Y9 _* Q" u8 y- D        uint linshi1,linshi2,e=0,f=0;4 d- ]- ]7 J: i" \* e
        uint q1,q2,q3,t;4 d& }- _+ K# W8 T5 A2 E1 h4 \0 k
        uint luxian1=0;0 W% |& F7 l. _& ~6 U+ E
        uint m=0;
$ q: W  Z8 v* N; i9 s6 ~4 s        uint n=0;/ [! P1 `& X& h( p+ }
        for(i=0;i<520;i++)$ }4 z: r# U* B
        {
/ X/ [! W1 w4 V( [                for(j=0;j<200;j++), O( b! j' H2 h; b7 j
                {3 w8 A* \& o. g" B2 K% B4 q1 n4 o. m
                        if(y[i][j]==value1)//寻找包含起点的所有路线,将路线值放入数组a) }' }2 p% j2 D
                        {
* X, P" |, c+ Y$ R5 A( _! V+ ]                                a[m]=i;
# J7 R4 ?6 v' P  R; C" _3 J                                //a1[m]=j;$ B, s$ Q- z+ D" n. U8 K
                                m++;3 K1 l7 u6 s5 \, m
                        }. k7 Q* k' A. o4 u9 R/ S$ f
                        if(y[i][j]==value2)//寻找包含终点的所有路线,将其放入数组b6 z. l, J1 F, r, `# `. o2 ?
                        {
' v& e: s- I. I0 }0 U' ~                                b[n]=i;
' `- J2 e$ N3 a% L; b9 J* B8 _                                //b1[n]=j;& O# F% c5 S) Q" f9 r6 I
                                n++;  n" e% N" N5 \8 ?- ]0 N4 f2 U
                        }0 }9 I* {9 Q' y, m$ ]1 O/ ?2 \  E
                }                5 D) j! v. ?# C3 L
        }& v  ]1 t9 V$ S0 a
        printf("所有经过起点的路线a为:");
: L: z; p# |% P7 H" W        for(i=0;i<m;i++), B0 k9 X$ o0 w4 \+ z: |
        {8 g/ {8 m3 M6 T* `) G5 f5 S
                printf("%d  ",a[i]);                5 c# N" M- @, W
        }, ?. q2 `+ x  M
        printf("\n");
: ?  ~6 Y; s+ e3 H! W        printf("所有经过终点的路线b为:");
4 @0 Q3 E" ~9 D        for(i=0;i<n;i++)
; e: U+ b' B9 s% m) G. T        {
9 h# S0 L  y, s; M# ?2 g                printf("%d  ",b[i]);                * d) t' ]+ Y- O
        }
  H; Z3 b  R9 X        printf("\n");" D6 |. m2 b- }; D: b; O

" f: a3 C! o8 t
4 ^+ O2 `; |) l) m( t  M3 ~/ I) X7 l
        for(i=0;i<m;i++)//直达路线的寻找
) J: T7 H9 p7 _0 O+ l5 q; u/ Q        {
( t7 E) v- C2 j9 g" Q                for(j=0;j<n;j++)
2 G! b4 ~9 j* w$ V4 Z                {
* y9 M! O' s0 o3 b8 x                        if(a[i]==b[j])
9 j+ B0 y+ \. C% C0 ^% g                        {
  d7 r  A+ E1 i  m0 F6 ]                                c[k]=a[i];
7 f% A) T5 ^0 d: P                                k++;                                       
/ {/ V4 Z+ o5 R, R0 |, F% ~$ q  q5 X                        }
# H' Q. E; f  @4 V. q  ^! i                }$ Y! l. e7 ^# b
        }
# m, c4 R+ @. s9 |+ p/ P0 I        printf("您查询的站点的直达路线有:");
4 L9 I/ g! y* o4 @  v        for(i=0;i<k;i++)4 J4 z- T# I" Q# F
        {. D0 u4 |8 U/ G9 v8 k5 R5 e2 g
                if(c[i]!=0)% I+ J! ~1 `1 {: x$ ~
                printf("%d  ",c[i]);
! s' E% m8 n' A* d        }- i/ n& C, f, E, F9 }& s
        printf("\n");//若没有直达路线这数组c为零,接着下面转乘一次路线的寻找# i# e" W, n9 S+ x+ n0 G" ]! H
1 W$ y1 y9 ]) K5 n4 d" H: Z  I9 M2 L

1 L: p  N( R$ R1 {( r        if(k==0)
+ U" g2 ~) M. a* ^        {- K( _5 U# N, S% ?3 U: p( ^  Z
                for(c1=0;c1<m;c1++)//转乘一次路线的寻找: ]6 K7 W7 D3 y; D# n
                {% R0 K2 g& u) y% V- {
                        for(j=0;j<200;j++)2 r6 b1 {# ]" e. z) [# b. U
                        {
& i8 x7 S- F$ B% `" d- u# f, [                                linshi1=a[c1];( `  Z. T4 u! e: Y  L0 Q
                                k1=y[linshi1][j];//取出a中每一条路线上每一个站点,接着与b中站点进行比较,查询公共点。3 A/ l. v; ?, N/ O8 M6 l
                                for(c2=0;c2<n;c2++)5 n+ U% \2 n( ]
                                {7 I- I. u) X" k; p! f; n
                                        for(j=0;j<200;j++)//该算法不是很好,j小于200时还得往后遍历。
5 Y+ N* k6 `/ L* i6 ?+ g9 l! V2 U) G; W                                        {
) k" `  \  v! \! `+ k                                                linshi2=b[c2];
: c/ j2 r4 s: n3 P, l9 a                                                k2=y[linshi2][j];//将b中的站点取出与k1进行比较判断。
  B/ \$ u- _* R                                                if(k1==k2/*||k1==k2+1||k1==k2-1*/&&(k1!=0)&&(linshi1!=0)&&(linshi2!=0))//寻找数组a,b中的站点,有相同的及为转乘一次的转乘点,并输出。
1 Q! G, ~" i9 H( t9 {( y                                                {
# n3 `- i5 |! j. F* U8 f                                                        printf("您可以转乘一次,起始路线为:%d ,中间转站点为:%d ,%d终点路线为:%d\n",linshi1,k1,k2,linshi2);
. o3 m1 c: i6 B3 U8 b8 {$ ~4 a                                                        luxian1++;
" e2 t  D2 I( t9 M  n' A% M                                                }. y- t! M' ~! Z# G2 w
                                        }                               
; Q+ B2 }* h/ B& Q+ ]                                 }        9 O* p. E, v) C  s& n& `/ A6 B
                        }         7 L5 F  t' o3 `. F" [+ r6 |
                }
  n- b1 O* p6 ^( u+ N/ p  h        }8 W* }- T; q7 k1 N6 J
4 u/ B0 g' `& V$ I
. k' ?$ x5 i. f  I
        if(luxian1==0&&k==0)+ M* h/ ~0 X, s: k! @
        {
1 j0 o# x+ P. P- o2 @                for(c1=0;c1<m;c1++)//转乘两次路线的寻找
6 I7 f# v8 Y1 p) P$ S9 P) |: Z* W5 |( O# N                {
9 \% X5 N/ U& k- k( e9 r% x. I; Q) J                        for(j=0;j<200;j++)# |9 _/ x' K  Z- D
                        {" h' \( T& |0 |3 c  P9 c0 }% e
                                linshi1=a[c1];
* ?* N& `) L) r( q                                k1=y[linshi1][j];//取出a中每一条路线上每一个站点,接着与b中站点进行比较,查询公共点。
+ b( ]) ?7 E0 \) M+ x8 T                                for(c2=0;c2<n;c2++)3 x; l* [! B! z% y. r
                                {
9 W# o+ P7 F  [0 E! I                                        for(j=0;j<200;j++)//该算法不是很好,j小于200时还得往后遍历。7 o2 z- L! }( ]) o1 p) V2 C
                                        {  h$ e1 E+ c3 X- w
                                                linshi2=b[c2];6 _1 s; W8 C# F: O- d
                                                k2=y[linshi2][j];//将b中的站点取出与k1进行比较判断。
1 V( X* |7 {/ N1 I/ M1 @                                                for(i=0;i<520;i++)( j& r. [; S1 H" v1 l# t
                                                        {8 E1 P( k% Y% j, G1 u( o% q* K
                                                                for(j=0;j<200;j++)
$ z% _$ B! O! O. F& w( C+ U8 Z! u                                                                {
0 F# k; F) H) h- _# U$ o; [2 T                                                                if(k1==y[i][j]&&k1!=0)
6 ^" y& E' P9 w% I, C                                                                {
& @' Q" k2 r8 l. Z9 i                                                                        f=i;/ E0 a$ Z; ^: \5 H6 f$ m
                                                                        e=j;                                                               
+ ~5 o+ @6 y# n( P+ t6 @6 w                                                                        for(j=0;j<200;j++)* V8 n( c' A, R% Q$ p
                                                                        {" S) i! l0 g. s
                                                                                if(k2==y[i][j]&&k2!=0&&(e<j)&&(linshi1!=0)&&(linshi2!=0))7 |; }8 v6 M1 u! P( I
                                                                                {
. e1 W3 _! ]/ f3 o                                                                                        printf("您需转乘两次,起始路线为:%d ,第一个转车站点为:%d,中间路线为:%d,第二个转车站点为:%d,终点路线为:%d\n",linshi1,y[i][e],f,y[i][j],linshi2);" ~4 D' R( B$ m) a$ m  \+ S8 l/ ?
                                                                                        //q1=abs(e-a1[c1]);//计算每条路线上经过的站点数
8 A; @; @) B, u                                                                                        //q2=abs(j-e);
* {$ M# |; }. D  O' Q" C/ w, ]                                                                                        //q3=abs(b1[c2]-j);
5 n2 _6 M) ?6 [0 F, B                                                                                        //t=3*(q1+q2+q3)+10;2 ^4 L; D9 z& B/ W; G% ^
                                                                                        //printf("该路线总共计时为:%d 分钟\n",t);
* k* G3 _9 ?- q. }                                                                                }: p7 ?5 u/ C3 L* @( v5 v' R. R4 i
                                                                        }
, [8 u0 ?7 b. x0 v! ]- F                                                                }% l" Q, q, z6 T, D& B1 A/ G# Q: \- a
                                                                }/ |; n- g  R5 z* t
                                                        }   
2 K- i8 U, c6 a  h0 c+ i0 [                                        }        : V( T2 i2 U- {2 P
                                }- G; V5 g1 m: r, L
                        }
  w, Z0 U( E6 F# ]3 u$ V0 @0 C0 d7 \0 e5 S6 y) ?& U
                }
3 y; o3 W9 C' ?: S$ {1 T5 E        }$ d0 z+ g9 X( p. T5 L' O

, `6 v5 }& k; D+ _, h4 a8 h& }) c  K4 R" ~# c0 s  N
1 C/ z  P9 E5 D7 T& p" f
+ P! q3 O! a& K* i# d8 u

8 I) x- H6 K( M( U/ P$ B0 ^! i, U* A4 Q" H
* V/ f6 o- s" l2 R7 v6 }
5 W0 j7 N7 F; m& T0 L
: V2 E# W% a$ r- a- h0 F- ~9 Y8 I

" ?/ D. t8 n% ~- P! p
/ F. ?+ S7 E+ d( K/ F( t6 l' Q" V; V: e6 u$ I- b
}
3 ^; U* w( h+ K0 q* ^3 h9 a; @" F' B: r) B, M0 w+ V! s; N
        void main()
' F) m% e! Z+ D& _- D! J        {" |0 C& |4 g. V, r
                printf("请输入起始站点和终止站点(中间空格间开): \n");( ?/ _) G7 F5 W1 K8 d
                scanf("%d %d",&value1,&value2);               
0 Z' I5 [( C4 Z: r, M. u& P                routes();1 ]6 N' @( _, d- `% ~% X! _/ g
6 N4 _  E) ?) G( }. j
        }, }& \, @  g4 f: D
       
作者: 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