- 在线时间
- 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>
; B4 R% ]0 F) g6 ^#include <string.h>% q/ S9 o* l2 |+ p
struct stack) x- D, O8 N5 w4 Z/ t+ X; l
{int top , node[210];} f; //顶点的堆栈
! s4 {% d4 c! l$ S% t9 Z5 B6 Q& U* _int a[201][201]; //图的邻接矩阵
: F: X) C. V/ [+ y* \9 P& m+ Cint n;
* M% |& {; e! Rvoid dfs(int x) //图的深度优先遍历
2 g- Y1 q* Z5 k( C* ~) F @% a8 K{int i;7 O! a1 c: a4 F; m, O# {
f.top ++; f.node[f.top] = x;
- [1 { `) H( Wfor (i = 1; i <= n; i ++)
( m; {6 v3 z0 A8 ~if (a[i][x] > 0)
$ N, r' E) [ _" u { a[i][x] = 0; a[x][i] = 0; //删除此边& g. D! `3 Y. B# q1 o4 v" l; Y- l
dfs(i); b9 z# [! v# J, W
break; }4 d) W+ g( x* M/ e0 `% S
}; E1 {/ Z9 ~' `/ u* e7 E- @
void Euler(int x) //欧拉路算法
, q/ r) A$ U3 D{int i , b;8 E6 t2 c- ~! B6 y
f.top = 0; f.node[f.top] = x; //入栈2 r* g0 j8 n) Z4 A' H& ~8 Z
while (f.top >= 0)
' @" ^6 h* A, m; X% t9 m- X3 ~" Z{b = 0;
, F$ a- B, C8 }5 Z* u1 ~2 V for (i = 1; i <= n; i ++)
5 W6 K Z0 G6 ~0 N9 L1 _) Q/ dif (a[f.node[f.top]][i] > 0)
' @) I3 B1 T8 x* O- k2 H: x5 X4 y{b = 1; break;}
$ s( ^% N5 q$ X/ e if (b == 0) //如果没有点可以扩展,输出并出栈
3 S5 D4 W. p/ m; Z; X1 P9 i! L{ printf("%d " , f.node[f.top]);! O5 Z1 x( q9 H& w, p
f.top --;}; X8 m7 l$ p% ]% g
else {f.top --; dfs(f.node[f.top+1]);} //如果有,就DFS) @; W$ }9 c6 ?
}1 v' ~% y6 b, G/ q+ u
}- l( f8 K6 s* N0 | q/ }
int main()
# r* _8 w/ w: B% Q' S{$ D! O- ^( n8 \0 s/ J2 `8 o
int m , s , t , num , i , j , start;
7 z" @! \* m9 c, a, x0 Y, S //input" `6 r9 Q4 b# s, |7 @, @! o5 P. Q
scanf("%d %d" , &n , &m); //n顶点数 m边数0 B) Z) ?) ]' p. r X2 k
memset(a , 0 , sizeof(a));! l$ ~# c" I1 K7 b- e6 n
for (i = 0; i < m; i ++)
0 u$ P( q# a z0 G2 M9 p& ]! Z{printf("innput s,t");& H+ n1 L# F S; y0 o! R
scanf("%d %d" , &s , &t);9 }+ v; U8 R+ x( q( f# ~
a[s][t] = 1; a[t][s] = 1;
/ Q1 ^* E) u7 [4 _}, m4 p' e' i& e2 G2 a( G6 m N8 _
//判断是否存在欧拉回路 T, S6 c! c) a; }+ l9 p3 ?
s = 0; start = 1;. p" i% Q4 o) w; g' a$ P
for (i = 1; i <= n; i ++)
# }" F2 j2 |+ r% k, z+ ?{num = 0;
$ c& Q. a/ D9 ]1 V: ]- |. p) _for (j = 1; j <= n; j ++)
/ _8 ?9 n" U4 M8 u+ W0 F" ^ num += a[i][j];2 j4 z S6 }9 Y( j) A. m
if (num % 2 == 1) . S& T$ n% g( Y& T$ f& z
{start = i; s ++;} c# W$ ]7 B9 s9 E8 [( M
}- w d/ S7 w/ v! B
if ((s == 0) || (s == 2)) 1 P( F+ p5 C/ U1 Z, b
Euler(start);: q+ X. f# @) z* P
else printf("No Euler path\n");" B7 G* \8 J3 R8 f, F- X
getchar(); getchar();- }( [' L1 l9 ?# H
return 0; } |
|