- 在线时间
- 9 小时
- 最后登录
- 2012-10-15
- 注册时间
- 2010-3-30
- 听众数
- 3
- 收听数
- 0
- 能力
- 0 分
- 体力
- 80 点
- 威望
- 0 点
- 阅读权限
- 20
- 积分
- 53
- 相册
- 0
- 日志
- 0
- 记录
- 1
- 帖子
- 53
- 主题
- 0
- 精华
- 0
- 分享
- 0
- 好友
- 4
升级   50.53% 该用户从未签到
- 自我介绍
- 数学的一个懵懂者。
|
#include <stdio.h>5 Z: f3 Z/ A& G0 e( k+ D# J
#include <string.h>
& j- ^+ m! h: {" E- O( O( Ustruct stack
7 r) i7 x2 @( P: Y{int top , node[210];} f; //顶点的堆栈
. x- q) Y% m- j2 C# r7 T3 Wint a[201][201]; //图的邻接矩阵: }" A5 g ]: X: ?4 F [' T! e( E
int n;( I3 o5 }9 Y+ B# W; i' ^
void dfs(int x) //图的深度优先遍历
! [# N1 ~* \/ i# P8 b7 Z% C* Q{int i;
; Y$ h0 ]$ c ~f.top ++; f.node[f.top] = x;
" m. s+ W& M& H* O* ifor (i = 1; i <= n; i ++)+ }% [2 j6 v/ f6 `6 Y" X
if (a[i][x] > 0)
& Q& [+ W# f5 R. u { a[i][x] = 0; a[x][i] = 0; //删除此边% M$ T8 m" i, q- s( e( e
dfs(i);8 N% K* m5 i1 t0 B4 U
break; }
- d' f. M: M7 ?}
) S* [/ ], G7 @# d `9 Vvoid Euler(int x) //欧拉路算法- K2 [9 E8 s7 I& z; w( f
{int i , b;/ b3 S9 _8 `2 M& N! L1 y
f.top = 0; f.node[f.top] = x; //入栈- `6 C `; |* e* @
while (f.top >= 0)
# k+ v/ ~/ g; B. Y$ U{b = 0;. t' v& g- z8 o& F9 R! s6 N, T8 H1 S
for (i = 1; i <= n; i ++)
; y. u4 V# y4 g2 n/ V, ] ~1 n2 w Gif (a[f.node[f.top]][i] > 0)
) w2 U( @: ~1 A2 ~* P) I{b = 1; break;}- f9 Q" d* n) b. e# V0 y
if (b == 0) //如果没有点可以扩展,输出并出栈
, f4 G$ t! B1 P: }. @6 ]0 v{ printf("%d " , f.node[f.top]);
! A1 p" O6 Q: w7 P' j0 u f.top --;}
3 F' }$ Q' [+ {+ Zelse {f.top --; dfs(f.node[f.top+1]);} //如果有,就DFS
" u0 _+ w* {! `( F}4 C( l% D7 P. ?& f$ [9 Q
}1 n M$ R& P" M+ N( r+ i
int main()- ?6 d A6 S$ V% S2 E5 W: {
{: z3 v" Y( y B/ W# O0 e3 w0 ^
int m , s , t , num , i , j , start; `4 y. }" h/ c
//input
5 A, E7 D# c g$ w3 i% T" Tscanf("%d %d" , &n , &m); //n顶点数 m边数
8 g: y+ J. T7 t0 ~memset(a , 0 , sizeof(a));
! _5 p7 W6 X5 ~8 z2 `% u4 G5 D K; X for (i = 0; i < m; i ++)0 w/ u: _9 X& S" ^1 p8 O
{printf("innput s,t");
4 i4 S) m# |, _3 V, m& [ scanf("%d %d" , &s , &t);
1 W7 y* s( L; G& C. A2 @ a[s][t] = 1; a[t][s] = 1;& J7 b7 C. K. _; b) N$ ~
}
8 R* b5 w' A9 P //判断是否存在欧拉回路
% c2 a {3 J! R3 E5 L0 t) _. ]s = 0; start = 1;
7 `$ j b; {) W) Y( \ for (i = 1; i <= n; i ++)" H+ `, j, W3 A' ?. N
{num = 0;. n n* D+ O" v$ M, X
for (j = 1; j <= n; j ++)* Z9 r2 r4 @3 c4 k
num += a[i][j];& K* x2 _6 a; \3 `! I& _
if (num % 2 == 1)
1 b6 t6 B6 _) x) n/ L' S{start = i; s ++;}
: r. m7 w( E: u2 ] `" [ H' j}
3 E& j# b. c1 e% Q2 H. X. S, {if ((s == 0) || (s == 2))
- J) C/ i. B, J" y: q6 N5 ^0 UEuler(start);
' p( M: v8 n6 w: G3 I else printf("No Euler path\n");
6 O X% g. ?; h$ y+ i5 Y8 N4 Xgetchar(); getchar();3 h/ D0 ^$ N/ H: b& y) R
return 0; } |
|