数学建模社区-数学中国

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

作者: 舞情_Dong    时间: 2012-8-19 18:02
标题: 公交路线最小换乘次数的路径选择算法(C代码)(请求高手指教)
第三天了,关于交通路线的选择,用C语言写成了个样子,下面代码可以正常运行,就是路线选择的结果不是很好,结果有好多重复的,有些站点似乎选不出来,这和存放交通路线的数组a有关,我们是把公交路线的上行和下行放在二维数组的同一行的,肯定有重复,但对程序算法也有质疑,实在是惭愧,自己不才,对其它语法实在是不太了解,用的都是for,if循环嵌套,还请仁兄指教。这是2007年的全国竞赛题,网上也有各种算法(基于不同语言),我们建模培训做真题,按自己想法用C编写了下面的程序,但结果不是很好,自己对其它的语句又不是很了解,实在没辙了,真心请教各位大侠,现在在改数组,打算将同一条交通路线的上行和下行放入数组的不同行里,真心寻求帮助,请求仁兄指导,谢谢!
% F# F+ G$ {! n4 t# S# V! l
. k. c4 c# c- C6 s" q/ H8 G  V2 t% v
编写的C代码如下,由于数组a的数据带大,粘贴不过来(520条数据)
2 X, P2 V. P" [7 E9 L' v 本人实在是很惭愧,对C其他语法语句不是很熟悉,用的全是for,if循环嵌套,还请仁兄耐心查看/ @& j3 _1 I: ?1 ^3 D
, ^& Y3 G4 W  H; z
9 M2 X9 p8 \1 o% b) e
        uint value1,value2;
8 F+ U) X# x; T, x# _        uint a[200],a1[200];//定义一个数组
" y1 a6 `: [' L' U6 E5 G6 F        uint b[200],b1[200];! ?/ |" Y: N& S6 r' r
    uint c[200];
; b! z: L; G9 |' J0 y/ ~6 p& @% Q" b- _4 i* k/ I3 J
& D" h7 H0 v' i0 q/ u& X

" F8 Q' m: Q- t1 R; Ivoid routes()7 X8 K. `/ e) T, }7 B# j
{
/ E$ v0 g2 F3 o- R! n" L+ T        # ~/ g0 o% m, |
        uint i,j,j1,j2,j3,j4,c1,c2,k=0,k1=0,k2=0;
& M  Q3 V+ r$ `6 m6 V        uint linshi1,linshi2,e=0,f=0;
9 V" p* o# ~: ]# B        uint q1,q2,q3,t;
+ J, p" g6 G( }        uint luxian1=0;
, l: y" O1 {+ ]6 z- ^8 b. X5 w; n        uint m=0;2 Q" Y; `: t/ `& S5 A$ k" D6 b. G
        uint n=0;
# v$ c8 H$ _) q! a5 `9 `/ B        for(i=0;i<520;i++)
& D! `$ N% g9 w        {
# v# \5 G: {& ^, s8 d                for(j=0;j<200;j++)
0 r) y6 }$ C9 |                {) R! b: j- G( X' O4 }2 a
                        if(y[i][j]==value1)//寻找包含起点的所有路线,将路线值放入数组a
0 j  _, K& B& w" C9 k% L8 q                        {
0 G9 M# W- z6 m, L5 V; a                                a[m]=i;: v" c2 z1 x* y( V, q
                                //a1[m]=j;+ f/ H2 e# N6 x
                                m++;
* Z7 I, X2 H& n, _1 N& V( Q; g1 I                        }; b  k6 A+ K8 p+ u& [
                        if(y[i][j]==value2)//寻找包含终点的所有路线,将其放入数组b
; o0 D3 z, y. ^                        {
/ u; s" u6 X% V$ ^5 {* f7 d+ e7 K                                b[n]=i;3 H. w3 V( Z  ?! p! q0 U+ f
                                //b1[n]=j;
+ j2 o  e2 R  |/ \5 }0 w/ J                                n++;0 r& ^4 k2 h2 S7 y' \( J% ]
                        }0 u0 y9 t8 J9 K. }5 n. E" k5 t
                }               
4 B% e' o6 s) y: q. o% X9 a- E; t        }
0 z' U7 n. x# y$ T, B  g        printf("所有经过起点的路线a为:");
! m0 l7 ~; R! U" c3 P% k        for(i=0;i<m;i++)7 h' l  n7 E6 R0 u1 f- l* k& @8 }
        {
2 M( i( Z4 H& p; H                printf("%d  ",a[i]);               
: ~% G  [  N% ]( W! d        }
. J" X7 B) a% _% l7 p; g" @8 k        printf("\n");7 I0 x2 T4 h0 `) u7 }
        printf("所有经过终点的路线b为:");
" c/ N, a- j, K* d6 H: [3 ~        for(i=0;i<n;i++)3 ~3 J! i+ \6 @; W9 A3 e( T' M1 U7 h
        {
- i3 ]$ q7 \) f3 X: w. C* V  r2 Z  o                printf("%d  ",b[i]);               
1 x* d+ N$ E" I( t) U/ {        }
* J, k. U( o& n* W% X# I& t        printf("\n");# {* f) T+ j; C6 ?7 X$ }

  A+ W+ A# J/ J( B1 [6 y* A2 D
2 X! f2 |% @* |/ `9 ~0 W3 l2 B! j9 v
        for(i=0;i<m;i++)//直达路线的寻找
/ H" X, q7 U* A! }# }. _7 W0 D        {
6 V- a0 W! i. p3 _                for(j=0;j<n;j++)
+ g$ t$ h( C0 \0 `! H7 u                {  L: W! V; p9 }) W/ T' f- W( N
                        if(a[i]==b[j])3 Z6 x9 c0 X: w" C
                        {
9 ~( C2 D* m: t, N& J/ r5 M, f; ~                                c[k]=a[i];
; k2 L" x9 k! H                                k++;                                        ' c: Z  x  l/ K( `6 N7 d
                        }
9 o5 m- g8 e. B$ J                }: ^1 L" _) `) U: G; n: a
        }
2 R. s0 Z9 F* B& ]        printf("您查询的站点的直达路线有:");
* e0 M5 K4 c  [1 u/ X1 [        for(i=0;i<k;i++)% h1 |# ~, H; k* J% z& _# S
        {
' L" p! n+ F( s; s                if(c[i]!=0)
0 E9 V# N1 j* \                printf("%d  ",c[i]);( l9 j6 R5 p& g7 p4 \, F% ~8 g
        }* ?4 U0 a9 W3 `% ^0 i
        printf("\n");//若没有直达路线这数组c为零,接着下面转乘一次路线的寻找
" P: ^! V6 d8 {2 D- x& q4 L- R& ^* I. s4 }* |

6 V0 s8 l; j0 u2 D' f  K# p        if(k==0)
( x& z- v! o1 ?$ l        {
$ S# J8 l9 g# [" ^                for(c1=0;c1<m;c1++)//转乘一次路线的寻找" [( [2 H3 L. L3 w. F3 n% x
                {
0 G4 Q5 c: B( n1 V* G" ^0 a                        for(j=0;j<200;j++)* f7 y7 |% }- t
                        {
3 U+ l4 O& d+ x% a4 d                                linshi1=a[c1];
7 G1 `/ ?  T/ Z4 e                                k1=y[linshi1][j];//取出a中每一条路线上每一个站点,接着与b中站点进行比较,查询公共点。- }2 N; [3 S# N- x5 d( a
                                for(c2=0;c2<n;c2++)
' G9 d% h* I" K& f: E# M4 ?8 ?- M- s                                {& ?. @8 h4 o8 S* I  y
                                        for(j=0;j<200;j++)//该算法不是很好,j小于200时还得往后遍历。
4 t: f+ w0 h/ g3 [                                        {
3 L- t# }6 q# _2 x3 F9 d                                                linshi2=b[c2];6 i) l8 E* h/ V- u/ [' M
                                                k2=y[linshi2][j];//将b中的站点取出与k1进行比较判断。
: z2 l8 a. r% v) D2 z- I6 l0 I                                                if(k1==k2/*||k1==k2+1||k1==k2-1*/&&(k1!=0)&&(linshi1!=0)&&(linshi2!=0))//寻找数组a,b中的站点,有相同的及为转乘一次的转乘点,并输出。3 R1 W6 `/ _" n2 n
                                                {$ j" J4 Y: p9 x, r5 e& J
                                                        printf("您可以转乘一次,起始路线为:%d ,中间转站点为:%d ,%d终点路线为:%d\n",linshi1,k1,k2,linshi2);
$ \# X7 }& X, N                                                        luxian1++;
4 _5 S5 I2 k7 K* m                                                }
$ @( ]' e' G+ O9 R" @                                        }                               
- N4 C# B- ]; w6 d7 F                                 }       
3 ^' e6 T2 M: H% U8 s8 A                        }         8 f: Z9 Y& E( w: u# P
                }
5 D1 g8 v' V: u9 j        }! q0 q: l% q" ^, U

) ?. U& U2 e7 o* y. `0 D, |; k& h% B& S# h3 X, O: w  N& D
        if(luxian1==0&&k==0)
8 ]6 R( E, U% `5 b        {
  w& Q2 G; A# h1 R                for(c1=0;c1<m;c1++)//转乘两次路线的寻找
, [- [- w  f- Q                {
% H* i9 M) i0 ~1 Y% @; X/ n. s                        for(j=0;j<200;j++)
# o6 v" e4 D9 e/ T                        {
( d) o  N9 L4 J# Y$ ?                                linshi1=a[c1];: _5 K) h7 M; T, I
                                k1=y[linshi1][j];//取出a中每一条路线上每一个站点,接着与b中站点进行比较,查询公共点。/ v8 u0 j' E# N
                                for(c2=0;c2<n;c2++)
, J( ]; d* K, G8 o6 @5 P                                {# s" O& I7 |1 }5 ~2 m) d' a6 {, A
                                        for(j=0;j<200;j++)//该算法不是很好,j小于200时还得往后遍历。7 S: n' m8 J  Z1 n7 r
                                        {& r* Q# w5 o- M; y& p
                                                linshi2=b[c2];- U/ I1 K. m- t. v# u0 q0 T
                                                k2=y[linshi2][j];//将b中的站点取出与k1进行比较判断。
4 o6 |3 z  d) J2 ^                                                for(i=0;i<520;i++)
' ~2 V8 d; p& l; J                                                        {* [1 q' V6 I2 z( `+ d! ^
                                                                for(j=0;j<200;j++)1 X2 v) z; e# }+ ]$ ?0 F
                                                                {
' \; \  N4 H! _# d1 f3 O2 ^+ g1 F) p4 \                                                                if(k1==y[i][j]&&k1!=0)/ l7 X/ T3 X2 {' R$ w: K
                                                                {
( H* o8 Y+ q( n' p8 T. A                                                                        f=i;2 j# G0 b/ l2 y) ]) l
                                                                        e=j;                                                               
/ d! f+ R! R' y0 n+ u9 C                                                                        for(j=0;j<200;j++)
  o- o5 t4 h. L8 k: }: m                                                                        {/ T1 S! `, Z" z! _+ c, N, ]
                                                                                if(k2==y[i][j]&&k2!=0&&(e<j)&&(linshi1!=0)&&(linshi2!=0))( A: X& ~0 t* f  o
                                                                                {
8 z; T) X% n" `6 Z# s" [: E6 U                                                                                        printf("您需转乘两次,起始路线为:%d ,第一个转车站点为:%d,中间路线为:%d,第二个转车站点为:%d,终点路线为:%d\n",linshi1,y[i][e],f,y[i][j],linshi2);& ?1 {' M, @+ P
                                                                                        //q1=abs(e-a1[c1]);//计算每条路线上经过的站点数
' D5 \4 }# X9 L4 ], o6 F% V                                                                                        //q2=abs(j-e);6 p9 C) w! z2 F1 ^
                                                                                        //q3=abs(b1[c2]-j);9 ~+ p2 K! d4 w( A$ W( a9 E
                                                                                        //t=3*(q1+q2+q3)+10;
, ^6 l9 |! y0 W) ^" z                                                                                        //printf("该路线总共计时为:%d 分钟\n",t);
1 r$ X+ N. q- `& `                                                                                }
- x! Q* L6 f2 Z# Z  c  \, l                                                                        }  h, `* i. f8 r$ i. J
                                                                }$ z- e% |3 Q7 T7 x
                                                                }/ M+ C, l' s& }
                                                        }    2 m& \9 C( T9 _8 h
                                        }       
+ _  U9 |# |! U( y+ `5 I                                }, H& K* R) n, v6 N
                        }
- I4 ^+ y7 a9 Q9 i& |+ S8 @. i. C) D; m) S
                }/ K0 Q. b& {8 D& _# u! |
        }4 w2 E( p" c( V9 H- s! W0 e  T7 G

4 u0 \  u, z2 \( M: z, i9 c! e
0 l" ~9 K; e- k6 C* [, {4 B. \6 L+ @+ x$ i- E* t

0 l" q! x( \& J. m) ~
/ T. o7 z3 d2 M: }( B2 W3 G4 n
) I7 @, @! Q/ _% r2 U9 W9 o0 t8 r' A2 R  ?

3 @% I8 m3 h3 c: N0 e& q( h+ j% ^) V4 @! }% b2 o
: F4 A2 X( i/ F3 o6 t; s" u7 B5 B

4 K) E7 [+ j' W* F2 A* O$ X" R7 V) M; e2 H& |. ?: c, o
}" N$ p3 y- U$ L( q4 S* V9 L/ ]

" y( G! x# R3 c$ M8 G1 O  E        void main()! x+ ?- \& R  @% k
        {
3 P. v+ S& n4 L7 j* [5 O; y                printf("请输入起始站点和终止站点(中间空格间开): \n");% Z9 m3 ]7 i/ Z0 T& [& z  j
                scanf("%d %d",&value1,&value2);               
$ b! P, b) T8 I5 d4 N* P9 l! L. i) u                routes();5 n0 e; y! z( X( k8 ?) b! j  w! @

1 g+ T9 ^( n+ I- i  s& ?; E        }
& z, u# N) _2 H' r) x       
作者: 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