数学建模社区-数学中国
标题:
公交路线最小换乘次数的路径选择算法(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- C
6 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; I
void 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 o
0 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; e
2 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