数学建模社区-数学中国
标题:
公交路线最小换乘次数的路径选择算法(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/ B
void 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)//寻找包含终点的所有路线,将其放入数组b
6 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 d
7 \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 a
8 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