- 在线时间
- 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>
% S2 D/ ^/ ~* K8 Z1 ~9 |7 p1 C( ~#include <string.h>
! X* b% C& b; ~, [/ o" istruct stack& ^# s" j4 p" R+ j
{int top , node[210];} f; //顶点的堆栈3 N; o8 T" s, {* N
int a[201][201]; //图的邻接矩阵
' g. [! M5 b, S `9 k. j; B" p- aint n;: B. G2 ^ I& G( L# J6 J# E
void dfs(int x) //图的深度优先遍历
0 m7 W9 e& I& r9 J8 ?( D0 r{int i;8 @5 c3 E" d: o5 G9 X
f.top ++; f.node[f.top] = x;
~! J1 {( Y. r Q' O' p, \5 s: o5 tfor (i = 1; i <= n; i ++)
# X) W- O+ ]% M& p3 dif (a[i][x] > 0) y4 v! _4 l8 y" l3 x2 F, r$ R
{ a[i][x] = 0; a[x][i] = 0; //删除此边% l7 \) t& I0 Y/ ]& M
dfs(i);0 K- M2 w+ {" F( C2 d3 N) ^
break; }/ |+ e' m2 [6 D( L% o
}& }; X6 U0 t0 r* O/ j2 M" G" V
void Euler(int x) //欧拉路算法8 Q1 Q" S7 U2 [- W
{int i , b;1 k8 E3 V% \) n. Q7 z: `# ]
f.top = 0; f.node[f.top] = x; //入栈
0 r5 q5 a( Z5 Zwhile (f.top >= 0)
' F/ ^* @' ]7 ?) x* p, N8 _5 i8 d{b = 0;0 d5 m6 T; T, L$ @) ~" Y% l+ W
for (i = 1; i <= n; i ++)
: @( |2 L3 L2 k7 bif (a[f.node[f.top]][i] > 0)
" Y. ?- I4 f3 t& B7 t* T( @* ?. p{b = 1; break;}1 b: E4 N& m6 E$ R6 X, U
if (b == 0) //如果没有点可以扩展,输出并出栈% V6 p8 m0 f, \4 z
{ printf("%d " , f.node[f.top]);
* {+ H" C: S- n% G f.top --;}
: T; Y& S7 Y8 ~else {f.top --; dfs(f.node[f.top+1]);} //如果有,就DFS) V8 w6 E4 _0 N5 {6 q4 D
}8 u' |% X. d9 l l
}
& p) V d2 V! q* G5 o/ H& wint main()8 s7 o6 i- A. _, S4 {6 i, ]
{
: S; I) d! S x9 @+ m- lint m , s , t , num , i , j , start;
4 e3 L5 U' B. f' M2 }5 r. | //input, r" V" E) R) Y* O
scanf("%d %d" , &n , &m); //n顶点数 m边数! H7 }1 l& k5 t4 P& W2 f- e
memset(a , 0 , sizeof(a));+ j0 c7 Z, [% U3 M4 P6 r
for (i = 0; i < m; i ++)& A0 k# h; ^5 C- H. A) z7 S
{printf("innput s,t");
. a5 H; \! p6 ?) q* R scanf("%d %d" , &s , &t);
# |* ^2 y3 A% V% u: T1 u" @ a[s][t] = 1; a[t][s] = 1;
& k# o* R4 A# ]9 @- {/ D}; A L: e5 k) q7 I/ n q0 G
//判断是否存在欧拉回路
$ X( L3 l1 \0 M1 V8 O, t& ]s = 0; start = 1;
( g* N# Y o& V8 T# R for (i = 1; i <= n; i ++)
0 t" A! I* ~; Y2 A2 T6 A{num = 0;
" V; H" f; r, a4 Gfor (j = 1; j <= n; j ++)" m7 T- x; ^8 T% Q" }
num += a[i][j];
) K& G+ q9 A% T7 W8 f if (num % 2 == 1)
# | h' o3 }% N( Q7 L{start = i; s ++;}
; Y+ \- Q, O' h}
+ `- W) b5 v5 e" n7 s, N/ \if ((s == 0) || (s == 2)) 1 N1 @' @7 t8 m$ e$ Q6 q# l4 I9 l' o
Euler(start);
% ?0 g$ e5 N' U1 B3 q else printf("No Euler path\n");, k' G- ?3 m) e! y+ n
getchar(); getchar();
0 p" e3 J: I# _' Sreturn 0; } |
|