- 在线时间
- 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>
2 R! `' u! w8 N4 P#include <string.h>
# I! b( _3 B! p+ zstruct stack9 \1 F5 b1 N x) ] S0 K
{int top , node[210];} f; //顶点的堆栈* Y& U4 N2 A3 g6 K/ d3 V
int a[201][201]; //图的邻接矩阵
2 F9 ]! Y. e; Q7 ?; |! X' u/ R) Qint n;
6 d, M# g% k) C! R# e! Q6 z, gvoid dfs(int x) //图的深度优先遍历
+ K9 ]! b5 S0 ~: P: w{int i;0 w- i7 U+ w- f. `
f.top ++; f.node[f.top] = x;
2 P/ `1 w& r! C4 mfor (i = 1; i <= n; i ++) r- U! E# S( {( J' z. J
if (a[i][x] > 0)
% f; h1 O! x( w( z1 L7 C+ } { a[i][x] = 0; a[x][i] = 0; //删除此边" `# c& M i) g: e0 i$ k& h! ~
dfs(i);
4 j; X7 O5 r3 q1 ]break; }
+ a# { |9 P( k* ~, H/ {}# @4 H7 m4 x) @, @9 {4 Q
void Euler(int x) //欧拉路算法
) u% M' }& c" y+ n# ?5 D{int i , b;4 M" a3 y* C; E! |& a
f.top = 0; f.node[f.top] = x; //入栈! ~% j- y( h$ p& }
while (f.top >= 0)! A ?' O+ D( Q
{b = 0;) q8 S9 S( d# \* Z
for (i = 1; i <= n; i ++) 1 G! T/ V" I- `) V8 P' [( I
if (a[f.node[f.top]][i] > 0) % i9 h; H: H. f3 a v, L# f
{b = 1; break;}6 w! N$ [0 u, `5 T: s/ ~
if (b == 0) //如果没有点可以扩展,输出并出栈
; P3 K4 E, ~3 G( [! T( l{ printf("%d " , f.node[f.top]);
) x+ m) v5 E2 _( G0 n3 @ f.top --;}3 K6 h7 e# B1 V0 T
else {f.top --; dfs(f.node[f.top+1]);} //如果有,就DFS
$ ~/ V1 X7 Y' l}; K5 d# I4 W0 z+ `
}4 e' n' R2 ~, x) K" v! b
int main()
4 ]2 c- O& y1 K. k! m+ S{# s* Y9 ~/ E" q3 x& M
int m , s , t , num , i , j , start;, B3 Q n! j1 _1 p1 K
//input
6 w0 d- J: m1 |$ y% Escanf("%d %d" , &n , &m); //n顶点数 m边数
0 d- g" ]. @3 ?! L- ]memset(a , 0 , sizeof(a));
4 b2 C2 F8 x8 x; Q) M" E for (i = 0; i < m; i ++)
4 u; U' q T$ q{printf("innput s,t");
% f; c# A3 E6 o) W. w scanf("%d %d" , &s , &t);
5 n* m! c1 a* u- v* Q a[s][t] = 1; a[t][s] = 1;2 @) U x: ~/ C
}# q& ?/ H9 g8 \5 f5 [% d! `
//判断是否存在欧拉回路
* N. P5 O- o% X c) x, F' Ws = 0; start = 1;
0 X) o) e6 J9 T" v5 F for (i = 1; i <= n; i ++)
' i$ P1 S$ ]8 T& X/ V6 C, Z3 U{num = 0;
1 W+ ?& Y# ? t/ l: b+ q" v2 s/ ifor (j = 1; j <= n; j ++)
& y# I9 w8 u1 E# R5 r num += a[i][j];4 V4 ~6 z8 ~! G% C5 K0 m5 f" }
if (num % 2 == 1) . w& e& T l( u
{start = i; s ++;}
Y! M1 {/ y; B: Q6 \}4 L0 i9 W) g. S Y; S
if ((s == 0) || (s == 2)) 2 S! L8 S x& q6 q( \
Euler(start);. c" B' h ]9 s
else printf("No Euler path\n");$ Y3 u ?( e& [+ U2 D& {
getchar(); getchar();
7 W' B/ |6 X1 S! creturn 0; } |
|