数学建模社区-数学中国
标题:
公交路线最小换乘次数的路径选择算法(C代码)(请求高手指教)
[打印本页]
作者:
舞情_Dong
时间:
2012-8-19 18:02
标题:
公交路线最小换乘次数的路径选择算法(C代码)(请求高手指教)
第三天了,关于交通路线的选择,用C语言写成了个样子,下面代码可以正常运行,就是路线选择的结果不是很好,结果有好多重复的,有些站点似乎选不出来,这和存放交通路线的数组a有关,我们是把公交路线的上行和下行放在二维数组的同一行的,肯定有重复,但对程序算法也有质疑,实在是惭愧,自己不才,对其它语法实在是不太了解,用的都是for,if循环嵌套,还请仁兄指教。这是2007年的全国竞赛题,网上也有各种算法(基于不同语言),我们建模培训做真题,按自己想法用C编写了下面的程序,但结果不是很好,自己对其它的语句又不是很了解,实在没辙了,真心请教各位大侠,现在在改数组,打算将同一条交通路线的上行和下行放入数组的不同行里,真心寻求帮助,请求仁兄指导,谢谢!
7 p( g9 Z( m0 h
& w" b" G2 p2 K7 l4 }
J1 N; N0 U! [; l- E4 ~/ ~9 ]
编写的C代码如下,由于数组a的数据带大,粘贴不过来(520条数据)
$ p+ y; s2 d( ^" \ k
本人实在是很惭愧,对C其他语法语句不是很熟悉,用的全是for,if循环嵌套,还请仁兄耐心查看
1 U2 A7 I# T j* ~5 p: f
% m5 s; a6 }! }( v! Z
* ^) t) C. c2 _6 n" i" l
uint value1,value2;
7 c8 ?' y8 P" B" Q% D9 x
uint a[200],a1[200];//定义一个数组
7 g" g& h& P6 N, b$ B
uint b[200],b1[200];
1 F3 y1 F- M8 n3 [7 L* _; k2 ]% g% w
uint c[200];
4 ?( W' O1 a/ ^* Z$ y2 R" d5 f
* m" U4 {5 a+ N; {; A& E
9 ~- h5 E# _7 f8 _$ |( x, l/ K
; {: y8 H" }+ O! H1 M
void routes()
7 [( x4 h$ `2 x2 l9 o* p
{
3 `3 }* e7 E) u& H! X" q
2 E, l& Q3 J8 y8 I
uint i,j,j1,j2,j3,j4,c1,c2,k=0,k1=0,k2=0;
* y- v- D6 @; |6 P# v7 i; Y
uint linshi1,linshi2,e=0,f=0;
/ Y* x0 {7 F1 D4 V+ w" a. K1 H* H
uint q1,q2,q3,t;
& }3 u8 k0 V( [) P1 g) q) R
uint luxian1=0;
$ j7 E q# l: ?
uint m=0;
7 s1 |( m6 M4 f8 f. S5 r* F& ]
uint n=0;
* k0 G8 T* ^- K/ s$ w6 y
for(i=0;i<520;i++)
% e5 C" I8 v* [0 ?9 R: M. h' L
{
$ h. r; n: I6 D+ d) f; _
for(j=0;j<200;j++)
: ~5 o0 z: k) |" k+ F- C
{
9 m! G) ]! m9 P
if(y[i][j]==value1)//寻找包含起点的所有路线,将路线值放入数组a
: w( n4 d2 `, P1 O, p) d# v* P
{
& P5 I* \3 c* N
a[m]=i;
, P5 ]$ b' {. ~, s! ]; I& L8 E
//a1[m]=j;
1 \+ f# M6 U# K4 |, J! ~/ c8 I
m++;
, u. \5 |% d- `+ V. \% D
}
% l! e& l3 U; u, O6 ~6 A
if(y[i][j]==value2)//寻找包含终点的所有路线,将其放入数组b
+ q$ b$ g5 E. t9 O2 k
{
( P% n0 k) i+ Y+ f1 v" g
b[n]=i;
, ~+ m/ G, N4 h2 q7 V; a
//b1[n]=j;
* e" ~+ ^; J# u: ?( _+ O; i& N* o# X
n++;
+ p9 S( `, u6 U7 k# m0 g$ B
}
8 Q! W4 ^, O4 C$ N+ {
}
6 b! y" K* j* u4 j6 s! T0 M, Q! b0 J% o
}
; u" A( B8 Z$ S( s) X. m6 u
printf("所有经过起点的路线a为:");
) }0 e+ t, S4 {5 Y
for(i=0;i<m;i++)
6 g7 j3 r$ b6 |2 C7 [
{
, \, v; [/ S+ g+ l. J
printf("%d ",a[i]);
0 C- W9 o- ?( U) O) x
}
1 }: t! i' ^1 n; |1 h( V' A8 `
printf("\n");
! J g% n$ Q# d
printf("所有经过终点的路线b为:");
' x7 P; e: t" k" o; n1 ]2 f# k
for(i=0;i<n;i++)
7 U5 \0 u, _0 n6 Q
{
" D# }6 E# m+ u, o- {% d, x
printf("%d ",b[i]);
, P' n) F, ^9 w8 J+ u
}
* x0 [9 k" `+ ]/ V) q k% p0 C5 C
printf("\n");
! @$ L( e, y: B: ^1 @: h, C; e
: X5 i4 Z6 ]" r6 W" ^3 t4 r9 B
: A9 ^. _4 X' z2 h" Z6 k
: ~9 z! C; v. _4 ~
for(i=0;i<m;i++)//直达路线的寻找
_8 @/ B1 I# h6 I- s# }# V
{
/ _0 l: {- A6 p+ ^, T
for(j=0;j<n;j++)
1 V4 [, v" k) y3 c" p
{
3 d- n8 |* l2 o' J" e8 m$ U" K3 i7 \# N
if(a[i]==b[j])
6 I9 b, G* D/ V: u. w% B
{
* g; g- J1 f" J6 M8 P
c[k]=a[i];
H5 f4 y0 ^6 A, K$ V3 h; G! r' E
k++;
, v- C% ^/ e) `3 E( E v
}
4 N9 b# k, H, j& B! R
}
5 e$ a. x5 b" ?! d( u) K! p
}
, U/ _/ ^8 N7 C2 h: U
printf("您查询的站点的直达路线有:");
2 ~4 }- q; o- _6 y* K( B0 U5 E
for(i=0;i<k;i++)
9 f. |9 M4 }" y
{
* }2 f& r) i/ d* G
if(c[i]!=0)
" {4 l* {! A* ~8 w+ k% ]6 |; e
printf("%d ",c[i]);
7 I$ {9 ^. a" }
}
7 X: d9 r7 N% o% V+ A! G! h. L4 P5 x
printf("\n");//若没有直达路线这数组c为零,接着下面转乘一次路线的寻找
5 `2 H8 T3 D* f; y/ K8 a0 _2 H
- Z# b3 Y; O) Q) O1 h1 p
) q" t, I4 Z5 k q
if(k==0)
( s# o9 X0 }: `# j
{
/ ^; ]" J7 I/ [. U/ w8 x, a
for(c1=0;c1<m;c1++)//转乘一次路线的寻找
4 B# \2 h$ r* d; |' B
{
5 f: J# u! u2 _/ ~
for(j=0;j<200;j++)
3 K; ^6 r2 W: q7 B
{
. L: x, s E. k9 O. r
linshi1=a[c1];
0 g1 m) n- e& {, r+ w: v+ c
k1=y[linshi1][j];//取出a中每一条路线上每一个站点,接着与b中站点进行比较,查询公共点。
4 D6 t0 |8 `1 d4 e
for(c2=0;c2<n;c2++)
) ]# v3 R# E7 X5 l6 k9 |9 V) Y
{
) Z' S$ g$ Q2 E/ b b9 b
for(j=0;j<200;j++)//该算法不是很好,j小于200时还得往后遍历。
. s& Y' B9 \. W- [
{
! L* i$ W0 m* \' m: t; ~
linshi2=b[c2];
" J8 Z, H! t# P' t& b5 R0 _
k2=y[linshi2][j];//将b中的站点取出与k1进行比较判断。
7 D1 g# [; f, W% a3 A
if(k1==k2/*||k1==k2+1||k1==k2-1*/&&(k1!=0)&&(linshi1!=0)&&(linshi2!=0))//寻找数组a,b中的站点,有相同的及为转乘一次的转乘点,并输出。
- m4 j0 n7 a: L" x
{
" k' g5 ]5 t+ m- X7 y+ {6 z
printf("您可以转乘一次,起始路线为:%d ,中间转站点为:%d ,%d终点路线为:%d\n",linshi1,k1,k2,linshi2);
: t- m% ]* t* S+ w n0 m' i- U, \
luxian1++;
- y& N% k" e/ e/ {# x' t! y$ L3 e
}
. ^5 J. }. W. o- ~! \
}
7 z/ G2 O( f6 J$ f U0 F
}
' Z: p, r) Q! B6 ^
}
% ?" Q8 x6 B* i" o7 u/ t; Q
}
1 n% F7 t! _* ^4 u5 p8 ~' x
}
]5 [$ _& V. V+ o& @/ s
- P6 e# t& f/ N0 P
* w& W4 }$ ~0 y# u+ h
if(luxian1==0&&k==0)
+ a; Y* t* C! r: T: a* h
{
- Y4 X; F; r8 f( b
for(c1=0;c1<m;c1++)//转乘两次路线的寻找
0 y) m; A6 L8 e1 g$ Z) p
{
2 t* O' V C% |1 T9 c$ F9 U
for(j=0;j<200;j++)
- B0 u' d7 I; e0 N* T
{
/ s9 U9 l; u$ f( D+ R. ^4 A$ `
linshi1=a[c1];
1 O. r# {, h6 @' k" e, q
k1=y[linshi1][j];//取出a中每一条路线上每一个站点,接着与b中站点进行比较,查询公共点。
2 [0 {7 X6 q' D) w
for(c2=0;c2<n;c2++)
3 \, J- G' J1 W! R# y
{
7 W! `9 U. c! ^5 P+ f6 P
for(j=0;j<200;j++)//该算法不是很好,j小于200时还得往后遍历。
& w6 f- B, [; Y1 }$ z: u; F
{
& @5 [* o4 |4 C0 g w& p: X6 s
linshi2=b[c2];
, s5 \7 Z* h4 [ j
k2=y[linshi2][j];//将b中的站点取出与k1进行比较判断。
; G% j. o" S! j* T9 e& J# i
for(i=0;i<520;i++)
* n: U8 `4 D7 _7 S/ r
{
; s% ?6 d0 ?( P+ q2 Y L
for(j=0;j<200;j++)
( [; [3 S4 L, P! R0 {0 F
{
4 b# G/ Z! i* y/ {0 M8 C
if(k1==y[i][j]&&k1!=0)
- u/ r# x- Y/ V1 G7 |! a
{
' |2 o m8 e9 o0 d* r
f=i;
7 v9 O! }( t8 T' a) L
e=j;
" c; i: W+ M4 j& ~7 E! j
for(j=0;j<200;j++)
( U. j6 y) T8 P0 n, o2 Z5 ]
{
" j/ |$ h2 X2 j9 X8 t. @7 X
if(k2==y[i][j]&&k2!=0&&(e<j)&&(linshi1!=0)&&(linshi2!=0))
+ s5 Q% U5 t) \* G$ j
{
' N B) |+ q/ \3 g
printf("您需转乘两次,起始路线为:%d ,第一个转车站点为:%d,中间路线为:%d,第二个转车站点为:%d,终点路线为:%d\n",linshi1,y[i][e],f,y[i][j],linshi2);
: |; E# p8 ?' K4 H* v+ F
//q1=abs(e-a1[c1]);//计算每条路线上经过的站点数
H3 u1 b( c& ] U$ C
//q2=abs(j-e);
8 F$ l- A" S% q1 I$ z" z
//q3=abs(b1[c2]-j);
: v p1 i+ M' G: z: A
//t=3*(q1+q2+q3)+10;
+ B1 u4 R+ D# H* k2 r
//printf("该路线总共计时为:%d 分钟\n",t);
H/ j7 z3 k( R8 a2 J' N
}
8 S c; @5 X, W, ]* p
}
8 z9 _, |4 O" M. f
}
' Z) f8 I( z' a( g( X
}
4 h4 G2 [- I2 c* `% ]
}
4 l& t# W: P5 t2 X, \. I
}
' w: }, J" q9 @* `& x
}
( p$ S- t$ t X6 `8 \8 d9 M9 i2 E
}
& f* \: p3 P$ E D; G
) S/ Q! J m: W# t
}
& D8 K) v3 T+ o" c
}
6 s. F3 G7 \6 d8 P* M5 V( p. G
" n1 V$ O' N3 J" j' ^" E0 B
6 d+ \+ Q1 m7 |; J& ]; r0 a6 m
1 v% w' U* P# `/ k
6 ]+ s6 t1 G. M
0 @+ @6 F) }2 c! M& w, b6 e
0 R$ A0 n6 A. P
' C- X s0 Q, p$ ~5 L
4 O$ e& Y8 ] ~
$ }2 v7 f: Q( R+ t- N( J
4 E5 d8 c' G3 S+ o) w8 |
7 i& b9 m) ^3 r% ^& _8 W6 {* q+ L
2 J5 P# N0 C7 X- r g
}
: ^& E, N" s. @7 e+ V
: @ R5 M4 `( Z" v$ b. ?7 |
void main()
# ^4 }; X, U# C. @( O
{
6 f( F( L+ T1 a6 K
printf("请输入起始站点和终止站点(中间空格间开): \n");
! E* s! `+ ^, t2 }
scanf("%d %d",&value1,&value2);
4 @4 {. U) Y; g5 w& ?3 _0 |
routes();
/ ^) o r- w, e% A0 I2 q
A; |# H2 t, a v( N
}
5 T5 z7 W! I% y
作者:
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