数学建模社区-数学中国
标题:
公交路线最小换乘次数的路径选择算法(C代码)(请求高手指教)
[打印本页]
作者:
舞情_Dong
时间:
2012-8-19 18:02
标题:
公交路线最小换乘次数的路径选择算法(C代码)(请求高手指教)
第三天了,关于交通路线的选择,用C语言写成了个样子,下面代码可以正常运行,就是路线选择的结果不是很好,结果有好多重复的,有些站点似乎选不出来,这和存放交通路线的数组a有关,我们是把公交路线的上行和下行放在二维数组的同一行的,肯定有重复,但对程序算法也有质疑,实在是惭愧,自己不才,对其它语法实在是不太了解,用的都是for,if循环嵌套,还请仁兄指教。这是2007年的全国竞赛题,网上也有各种算法(基于不同语言),我们建模培训做真题,按自己想法用C编写了下面的程序,但结果不是很好,自己对其它的语句又不是很了解,实在没辙了,真心请教各位大侠,现在在改数组,打算将同一条交通路线的上行和下行放入数组的不同行里,真心寻求帮助,请求仁兄指导,谢谢!
# Q% ] ~# g# @; x9 E
! i) |% z* a4 U) Z8 f+ s+ M& T
0 j) U! t: M- f. I) ]- g
编写的C代码如下,由于数组a的数据带大,粘贴不过来(520条数据)
( M# K" h1 Z+ d9 Y( g
本人实在是很惭愧,对C其他语法语句不是很熟悉,用的全是for,if循环嵌套,还请仁兄耐心查看
" @& r4 v/ J% H. z
6 o8 g% N. k4 F8 j& H# U/ e
, l( p U) L8 x' H5 s- {1 [3 p/ o
uint value1,value2;
6 \+ L: Q; b$ H! I# x3 B$ n+ u A8 m
uint a[200],a1[200];//定义一个数组
0 y- B' w" j3 p( z+ L; z
uint b[200],b1[200];
. k7 R- I: p- O; G6 X
uint c[200];
% w6 F9 G2 @/ C0 Z' `! P
1 n; ^: B8 k3 v1 R) j" X
. s$ a! ^1 T# M( m7 j; |
~, S1 q1 z% P4 F9 N
void routes()
& y9 P* X9 u' `! M
{
. O* X0 X! s0 r) E8 p" a
" o* b! V* w1 n' ~
uint i,j,j1,j2,j3,j4,c1,c2,k=0,k1=0,k2=0;
: R% h! R; m4 Y( e
uint linshi1,linshi2,e=0,f=0;
2 o7 Y5 r f' S* k! x
uint q1,q2,q3,t;
: \; _* _' c6 a! \: Z# H8 O: O
uint luxian1=0;
6 Z; P1 b- t0 x8 t
uint m=0;
v% c* o0 r0 s% v' F% S
uint n=0;
. X- V/ p) o( U4 T, j
for(i=0;i<520;i++)
4 Z, o. ]* y5 E% Z
{
% J, G$ X$ H1 Q) N2 q
for(j=0;j<200;j++)
j. s- k4 y, H: [5 E; L$ Y+ X
{
1 w: r4 `* N" I" C: ^4 T7 ]2 [) d
if(y[i][j]==value1)//寻找包含起点的所有路线,将路线值放入数组a
% Q' o3 K- j0 j
{
' y7 W4 I1 |! e- K& C
a[m]=i;
7 f) l6 u) v: A' V! T U0 i
//a1[m]=j;
! K! Q3 E6 w" A. Z6 _+ V" p2 d
m++;
$ N3 C3 H; H2 O# `' x! O
}
" }6 [$ `& J: p) [8 |* O- Y
if(y[i][j]==value2)//寻找包含终点的所有路线,将其放入数组b
7 a' C0 c; [. m) {( S: ], \
{
7 h' ~! F# C1 M+ s) E) p
b[n]=i;
5 s) @+ N2 e$ P8 [- A [
//b1[n]=j;
/ ~/ N7 C1 E9 f1 T) C
n++;
, X3 B6 \9 Z# V& f4 E
}
+ z+ Y5 Z3 A" ^2 Y& H
}
9 J" i- z, i% K' [& W6 B1 g
}
7 e' F2 a, L: c$ M- }0 t
printf("所有经过起点的路线a为:");
2 _0 K, |8 ~, U; _; m1 `/ V
for(i=0;i<m;i++)
. W3 a2 H5 R9 u- z1 d7 Y
{
) u& U$ p9 \& M% q% o
printf("%d ",a[i]);
2 F6 Z) @ h. ]$ @' z1 ]/ Z2 F
}
8 H; W- x7 l4 L9 i4 n+ U8 j
printf("\n");
3 ~$ G: j2 A! S" w& G6 g
printf("所有经过终点的路线b为:");
8 S8 J4 w/ g9 e1 U* V
for(i=0;i<n;i++)
* f7 J' `; H, A5 ^
{
& F. z* Y4 {, Q, y7 H( O7 v9 I4 G
printf("%d ",b[i]);
( k8 R! G @, h1 t) H- q1 h
}
* h, a6 i: |9 H
printf("\n");
1 g" u0 E8 A! L1 I+ M7 Q4 T: A" `
" c9 I, K' A( R2 F$ U
" {( [3 k, C0 |( c9 F9 T
0 F) Z% }( A# g% E: X) L7 y# `
for(i=0;i<m;i++)//直达路线的寻找
4 L5 ^6 P+ h' ]+ q/ [! f/ i
{
. E, E" l5 f, O0 t8 ^+ ?
for(j=0;j<n;j++)
& M% W; v v" c, h
{
5 m! s, \0 \9 E' C1 r
if(a[i]==b[j])
# l% n4 s8 I! ~$ R3 _+ ^* L
{
4 _1 H" k; i$ {: S
c[k]=a[i];
, d1 i! P; g- i0 r% P! g2 C
k++;
% o& \/ u2 }) u6 V( c, C" I
}
& z# k0 f5 U) d. n) d
}
8 u9 Y9 m$ u, ^, N: G8 h
}
+ r: ^: z# E2 k, c
printf("您查询的站点的直达路线有:");
$ K" \1 Z4 ]: T3 z. O
for(i=0;i<k;i++)
7 t$ C: [/ ]6 x& [; \3 e& t
{
; O8 [& _' r/ W; ^5 {+ z$ G
if(c[i]!=0)
" L1 u$ |8 Z/ P/ h/ s* R
printf("%d ",c[i]);
2 C( A2 Q0 T. t. k- n
}
* }, E2 Z6 @- D/ K+ ?6 [
printf("\n");//若没有直达路线这数组c为零,接着下面转乘一次路线的寻找
+ b" b( b& z3 m9 M J p3 f* n2 K
7 J; u6 r! P, W! B
+ S y0 ]2 T9 x3 V% E$ K
if(k==0)
% Y# G( W. _7 D- J, b7 C/ C7 C/ h
{
7 z& a" E7 c3 [1 b1 b+ y& j* x. x
for(c1=0;c1<m;c1++)//转乘一次路线的寻找
9 J7 o+ c! W7 x! ?
{
' z$ ` ~; m8 X
for(j=0;j<200;j++)
2 Z9 R3 z( P8 p8 h7 O
{
6 A* N! V% j) X6 A2 M
linshi1=a[c1];
* T; @/ b6 E! q! y0 r) C
k1=y[linshi1][j];//取出a中每一条路线上每一个站点,接着与b中站点进行比较,查询公共点。
( @+ f. y9 l4 _/ U# `+ k
for(c2=0;c2<n;c2++)
! D) |- ~; G* t5 p" H. h
{
' c; i$ e) W- g+ |" [6 U
for(j=0;j<200;j++)//该算法不是很好,j小于200时还得往后遍历。
4 i/ O! s5 z4 ~1 ?# f1 F: ~; F; l
{
# j. d- u7 o! |+ m$ J3 K
linshi2=b[c2];
9 ?) x. m: S1 _: J
k2=y[linshi2][j];//将b中的站点取出与k1进行比较判断。
( y8 \1 u9 f- u1 E( q" Y
if(k1==k2/*||k1==k2+1||k1==k2-1*/&&(k1!=0)&&(linshi1!=0)&&(linshi2!=0))//寻找数组a,b中的站点,有相同的及为转乘一次的转乘点,并输出。
8 g: q: K" s, Y; s- u* H7 ?* |5 W1 r
{
% G% d- u1 w% ^6 K8 G# n
printf("您可以转乘一次,起始路线为:%d ,中间转站点为:%d ,%d终点路线为:%d\n",linshi1,k1,k2,linshi2);
& T4 I4 a2 ^# m! i2 w+ z
luxian1++;
, C/ Y' g% `- m" j
}
; _( D- k) x% {6 u& h
}
5 f+ O, H( G" t4 F) j9 |! r i/ s
}
/ S( c7 Q% H" V
}
9 a5 ?0 c k. |8 y8 J+ N3 z
}
8 o8 ?* x: D" p6 F- D
}
2 w0 @ E/ d8 l3 Z" y1 I
4 Q4 n1 \& I( u8 L$ l
0 D& {3 h/ r- l5 v8 v
if(luxian1==0&&k==0)
/ s; u" K* ^# o
{
/ O( @4 v0 p5 \ P& k c
for(c1=0;c1<m;c1++)//转乘两次路线的寻找
5 l1 x" {, K! W) g9 E! x( |) R
{
; Q) I- ]5 x. @$ [9 A3 ~' U
for(j=0;j<200;j++)
9 L& |: x8 t9 b. V- B
{
0 p/ l3 A% K6 e( O/ D) P
linshi1=a[c1];
2 X6 g* S, g) F' W5 @: Y# @
k1=y[linshi1][j];//取出a中每一条路线上每一个站点,接着与b中站点进行比较,查询公共点。
0 ?9 G9 l6 a) w* P% I
for(c2=0;c2<n;c2++)
' ]0 |2 y" i# |6 O' R3 H
{
2 _1 O, W6 N5 `4 \' D5 }9 m
for(j=0;j<200;j++)//该算法不是很好,j小于200时还得往后遍历。
' M- [- i$ P1 j0 D( {
{
8 k& A# k7 y$ ] ?& H; Z" r' a" D8 j
linshi2=b[c2];
! x" w; K5 W3 h: r
k2=y[linshi2][j];//将b中的站点取出与k1进行比较判断。
! M( N! p1 h/ W
for(i=0;i<520;i++)
3 v9 T4 R2 T, F* V9 g! U2 B4 v
{
. O; [: v$ e: F% q, R
for(j=0;j<200;j++)
: b/ s( w5 a6 h- ~
{
+ G; t/ b: V: N! s2 q0 y" c
if(k1==y[i][j]&&k1!=0)
9 y% g. _9 ^+ u. p! ]% O" Z3 Y+ }
{
7 S; [" m7 s) V4 Q; y- \
f=i;
* |! p4 M- Y# X/ ]7 `0 e' V
e=j;
; ~" p! d3 s) C; w2 @
for(j=0;j<200;j++)
; V5 g4 v3 F& f' [3 L
{
+ U" E z1 I# N- v8 F( _
if(k2==y[i][j]&&k2!=0&&(e<j)&&(linshi1!=0)&&(linshi2!=0))
4 W% ?$ a8 e8 N/ K6 L, D. ]
{
5 I8 y. @' a! G1 y$ @
printf("您需转乘两次,起始路线为:%d ,第一个转车站点为:%d,中间路线为:%d,第二个转车站点为:%d,终点路线为:%d\n",linshi1,y[i][e],f,y[i][j],linshi2);
" J* a5 [9 P( Y& C- S: d
//q1=abs(e-a1[c1]);//计算每条路线上经过的站点数
( j4 D% P: B( b5 x! Q) g' ^
//q2=abs(j-e);
& h% y( _. _& E$ ?- C, P5 @1 A
//q3=abs(b1[c2]-j);
8 P, Y( X( r# H! e ?+ e9 W
//t=3*(q1+q2+q3)+10;
2 l; c) p+ N: ~5 G
//printf("该路线总共计时为:%d 分钟\n",t);
& D' e7 n/ q. R1 k" z* Q) i, G
}
& V R( a# g5 u3 {+ m' h
}
- H8 |2 _8 s9 p- j, ^( l
}
0 D9 s! B& m3 ?2 h! F# X
}
2 Y, i P/ a J
}
( Y/ b; y+ j; R
}
: P0 Z8 B4 s1 J1 n. L8 m$ q
}
) [% t( W" [( u+ H
}
: z$ i% m: E; B( d! P" C9 o
5 ` y0 @! }* v$ n
}
' ^2 v7 X1 G) W. J2 m
}
. v7 {6 S9 |$ ?8 @6 J; X+ w; G* |) l
k) r5 O; {1 ~3 g5 V0 ~. W
, {9 w) S5 V! S3 ]* u
& @2 L- h* `9 W" t& T
; a* b. A5 T- r5 k; K
- `& q# X: N, G4 Q, v
2 l& Y' S, |" z$ }
3 c( K' e% O6 b
0 _( h* L+ K* }' r
b% Z9 h1 ^+ R2 z, b9 |
8 B/ o$ @1 K4 M
0 n& g/ s- ~, i3 g
" G$ b' y v- ~3 k3 {
}
& ~/ Z9 }# h- h
: g+ p$ L6 q# j
void main()
) n% P- T4 I* z0 R4 `- T P+ _8 Z
{
. o6 T/ y+ g4 R* v1 ^- S
printf("请输入起始站点和终止站点(中间空格间开): \n");
n: c& } h; e7 T9 | a
scanf("%d %d",&value1,&value2);
0 r, i: T# G3 a2 z6 [
routes();
$ H7 O. t% E" w" ~" c+ A1 v
$ R% q8 C+ z$ Y2 |4 \6 C
}
6 _. k/ \0 y0 k' W
作者:
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