- 在线时间
- 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>1 j% [3 w! ?! m' T; w
#include <string.h>4 n$ h: ^2 k& S* r
struct stack _& M4 I0 i+ H% y
{int top , node[210];} f; //顶点的堆栈- [1 P& I* d" {" i1 y m
int a[201][201]; //图的邻接矩阵
( V' C& X# l9 z. Bint n;$ t2 ?8 g( t1 K
void dfs(int x) //图的深度优先遍历- E+ F3 R i7 \# t2 r# }+ W
{int i;/ j5 |' o, Y: w. ?
f.top ++; f.node[f.top] = x;
3 H2 U4 K' J! h% e$ Bfor (i = 1; i <= n; i ++)
( v( |: x) z- a" |1 dif (a[i][x] > 0)- P6 }& v5 O: Q; ?2 x
{ a[i][x] = 0; a[x][i] = 0; //删除此边' n: T! j0 _ c5 M- z9 Z+ z" `
dfs(i);1 a( w% {( B' @+ J
break; }
, d) w9 W: j, E% F}
: J; H' b$ T8 ?! N* K! k* O! Gvoid Euler(int x) //欧拉路算法
4 ?* w0 t% t/ O* P/ d8 s{int i , b;4 i4 ?7 B, [/ v7 l0 S: ]
f.top = 0; f.node[f.top] = x; //入栈
. `6 m, z/ A9 X* j2 f9 u, bwhile (f.top >= 0)5 m5 h( l H( ^$ P6 a! W0 o
{b = 0;
# K- B' m' f( H5 I* c# P8 t for (i = 1; i <= n; i ++) + r$ o {7 @4 D' T$ z4 N6 { [
if (a[f.node[f.top]][i] > 0) 5 b, L1 }2 y5 I9 ^: N m3 u
{b = 1; break;}
5 s( \3 L1 t2 }; ]- F if (b == 0) //如果没有点可以扩展,输出并出栈# ^1 ~, A. R. b! K# N+ @2 z2 M
{ printf("%d " , f.node[f.top]);* Q1 \5 |# l4 b: E! H; V; y
f.top --;}
3 _7 d+ h2 u# w/ @" P3 H7 delse {f.top --; dfs(f.node[f.top+1]);} //如果有,就DFS+ d' E. j. { n0 z, c- i
}
: e' M6 q# M3 t6 b+ Q}
) d/ ~ F2 _5 w/ Tint main()
( Y. y! i: D# ~2 r# I9 M' ~{- e8 d+ Y# {/ U" a7 n! ?4 I- {* Q
int m , s , t , num , i , j , start;& O8 b9 B, f8 e# ~ K" y
//input
2 P: j2 m1 ^4 y" d' ^3 m/ Escanf("%d %d" , &n , &m); //n顶点数 m边数
* H) F) w7 h+ d- w( o" w. Umemset(a , 0 , sizeof(a));
: H# N, d1 V8 l" ?5 D8 V for (i = 0; i < m; i ++)* R: u! `) |. ^% m$ m
{printf("innput s,t");7 ^/ A$ }# {9 v3 x9 B3 }6 l
scanf("%d %d" , &s , &t);. F- R2 L3 a! P3 U
a[s][t] = 1; a[t][s] = 1;+ j" d9 O: w; i, m1 l, m' I6 k
}
4 ?3 F# T, F) y0 O# } //判断是否存在欧拉回路' d1 }2 N5 c1 W! T2 O! B* @; k. r
s = 0; start = 1;+ |5 c$ L0 c- k
for (i = 1; i <= n; i ++)
8 Z' C* T5 Z$ d) [# P{num = 0;( `) |4 @6 B* Q2 F& L
for (j = 1; j <= n; j ++)
; G' G* Z6 Z; ~ num += a[i][j];- ~+ @. K# Y+ z) n4 f3 d
if (num % 2 == 1)
0 f6 ?; P# J* _$ b1 |" n; d; ~) ]0 f{start = i; s ++;}5 G4 m% w. X3 h. W0 |& \; X9 V
}0 \+ y* |: F: L \ t" r
if ((s == 0) || (s == 2)) / F e, B" S* D
Euler(start);2 e( m3 K& S9 m2 h/ ~
else printf("No Euler path\n");: u& X @* D! i1 F
getchar(); getchar();' E$ ^/ [) ~3 b2 F/ w$ m" U
return 0; } |
|