- 在线时间
- 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>- _& y! E6 W; K9 v2 Y
#include <string.h>
& I0 r6 S1 R5 f8 ^0 wstruct stack* l) l( d+ O; y8 [' D2 g
{int top , node[210];} f; //顶点的堆栈
* [( E0 i3 E6 s0 f2 x4 [int a[201][201]; //图的邻接矩阵
, z1 J" S0 U, P7 ]" o" rint n;
N& h/ R+ L& Uvoid dfs(int x) //图的深度优先遍历; y1 B' j: X' @. t0 G
{int i;( n" u3 D1 |+ A L' m
f.top ++; f.node[f.top] = x;1 r0 ?; S1 E- ~. p) j) D1 {
for (i = 1; i <= n; i ++): t4 x" f' a1 G1 z0 f% u; H& E
if (a[i][x] > 0)
2 `( w2 ^5 |- I- K { a[i][x] = 0; a[x][i] = 0; //删除此边
, H' ^4 w/ k9 H" Wdfs(i);
- ]% ]' M# Z% N! e7 K' w0 xbreak; }5 o1 V& C3 h U
}. L( m4 h8 I2 W0 [+ @
void Euler(int x) //欧拉路算法
) ^6 S2 Z& N' z x* g# S& K& P{int i , b;1 X& R5 h0 G9 s) N6 H" ~
f.top = 0; f.node[f.top] = x; //入栈
: ?. d# X' O; z0 `' y7 |while (f.top >= 0)$ _5 @9 \. O; s$ C
{b = 0;9 L4 o. j# q1 @/ l2 f( W/ a+ \
for (i = 1; i <= n; i ++) 9 N3 o3 ` a) z# ^
if (a[f.node[f.top]][i] > 0)
' S5 j0 j2 h; e- I( x, v% [{b = 1; break;}$ a1 J- K! i; b$ X- k
if (b == 0) //如果没有点可以扩展,输出并出栈3 g2 e. I) k( N$ U
{ printf("%d " , f.node[f.top]);
/ q m/ U- O" k& [; c f.top --;}9 z+ Z! y9 ^) a* j& e/ `0 v
else {f.top --; dfs(f.node[f.top+1]);} //如果有,就DFS
) B; g$ m# I4 q! Z" K* |9 `9 t* V}5 K w% F% B! Z( {6 W
}
* }! Q m, f( m& b e! G" lint main()
* s) X |+ S1 I7 I5 p8 g& L{
( Q: M2 ]6 U" f T& rint m , s , t , num , i , j , start;
1 D) u) g4 ^1 a //input
{- K4 C b5 M& x3 g8 a- Vscanf("%d %d" , &n , &m); //n顶点数 m边数
! }$ ^3 E) }2 U9 B3 j& ~3 \memset(a , 0 , sizeof(a));! H3 l- R$ u& K5 z' r0 Y
for (i = 0; i < m; i ++)
( H( k/ {3 w! |3 a) K{printf("innput s,t");
3 N! y" P2 J9 P( q scanf("%d %d" , &s , &t);- P; b7 k! i4 p; _/ m
a[s][t] = 1; a[t][s] = 1;
* ]; H' M" d5 r7 w& m- U% e}
3 x/ {# k& y( @8 \9 `( q //判断是否存在欧拉回路
2 g7 P/ s0 Z8 j, {+ xs = 0; start = 1;' E) W V0 c8 T. b% K* J
for (i = 1; i <= n; i ++)
. e* t6 T/ c; ^* C, R- u{num = 0;7 _0 f$ j# ~, q, \+ K
for (j = 1; j <= n; j ++)6 V- F. O' P/ q
num += a[i][j];8 n* i. U) [% I5 w
if (num % 2 == 1) ' n c5 ~" n' x3 v
{start = i; s ++;}1 ]$ y. v! F/ z9 H0 a4 S' x4 a3 Q+ ^' c
}; c9 P# X# S+ E1 d; J8 y
if ((s == 0) || (s == 2))
( g+ I, ]& X% c# E! y4 t( ~Euler(start);& H' @$ ]1 W5 A2 Z, f
else printf("No Euler path\n");
+ V/ D# Z) }+ Qgetchar(); getchar();
6 q$ H, ?# G1 m" E [ Y! C6 a: lreturn 0; } |
|