- 在线时间
- 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>
; e* A; w X9 F4 W+ s#include <string.h>
2 g' c! ~8 i2 r8 h: M/ |$ b/ xstruct stack
, u5 L4 E6 m+ m! d2 h, P{int top , node[210];} f; //顶点的堆栈4 M3 Q* P* L6 F/ u
int a[201][201]; //图的邻接矩阵& R+ W# n6 L8 }( Q$ {
int n;
% t2 j, p' B; Z; t! n- E Rvoid dfs(int x) //图的深度优先遍历! B ]/ V9 V" n1 h3 d+ Y
{int i;& a1 p9 n9 _% @. P" z- o
f.top ++; f.node[f.top] = x;; [' H# S0 o3 u! S
for (i = 1; i <= n; i ++)
% }2 O! W+ y) u" u6 A# f$ }if (a[i][x] > 0)% t7 z+ k- u5 L1 K' R
{ a[i][x] = 0; a[x][i] = 0; //删除此边0 h9 N/ V( O- n8 W) ^
dfs(i);
1 y' U B" j& P7 E5 Kbreak; }5 p, M6 P9 P7 G6 j
}' k4 ^/ I; U+ K( v
void Euler(int x) //欧拉路算法
- J. X. F5 j) T/ C+ ~{int i , b;
) H4 P5 _8 F2 ]2 o" k/ Vf.top = 0; f.node[f.top] = x; //入栈' W2 y& y8 l8 ^. |
while (f.top >= 0)
: J5 c, Y# }& q9 p9 b{b = 0;
6 Y' m' z) g' G3 | for (i = 1; i <= n; i ++) 4 t" t+ R$ R( @2 R& K
if (a[f.node[f.top]][i] > 0) 5 [) ~9 {/ o4 P, x' e
{b = 1; break;}! O4 r, M2 c, s/ U: C: {
if (b == 0) //如果没有点可以扩展,输出并出栈
$ d% j2 A' W6 @ e: k{ printf("%d " , f.node[f.top]);; q7 G! c1 `; E% b* `5 Z
f.top --;}1 @" Z0 ?6 q4 M0 c4 D5 k, b' E
else {f.top --; dfs(f.node[f.top+1]);} //如果有,就DFS* H' o8 u4 Y2 H8 \' h9 |" _( _
}0 v# j2 s' A$ M4 M# U
}
6 o) d/ z" Z. o, C: `" w2 V% v! \" yint main() l5 J4 b5 u$ l* s- \- S
{: X* C2 d9 }1 Y. e+ ?8 N$ E
int m , s , t , num , i , j , start;
' Q( ]0 O3 p4 W! j; G //input
! D" d* V+ D3 S; D1 J" b& D4 escanf("%d %d" , &n , &m); //n顶点数 m边数* r! V5 V% I0 t/ N4 h
memset(a , 0 , sizeof(a));. V7 J: c& @6 I4 V9 a, T. E
for (i = 0; i < m; i ++)" \. I8 W: ~, ]& i
{printf("innput s,t");
" k0 m: p+ W0 j, G scanf("%d %d" , &s , &t);7 X1 S( K' j) ?: |% P! Z/ L
a[s][t] = 1; a[t][s] = 1;
3 [( w; s i& | T: T}- E, R/ M$ s% o( B c
//判断是否存在欧拉回路
6 S$ a$ f: ]& @% o$ g, j5 Us = 0; start = 1;9 g0 w* \5 f% ~; _. s
for (i = 1; i <= n; i ++)
: ?- r1 N1 r$ X+ f6 O{num = 0;) H1 m" }% f1 G5 [8 J1 j, X* G
for (j = 1; j <= n; j ++)
9 D; O5 d: e" I+ _( d" a num += a[i][j]; h/ X) p7 Z: h- [* B
if (num % 2 == 1)
( P1 H# `9 ~. W4 @0 L5 [4 t{start = i; s ++;}) r& x0 D8 P$ y6 P& K g
}
6 z/ K: W% I' Qif ((s == 0) || (s == 2))
! E5 T! {! F/ r8 r/ KEuler(start);* Y( K; b* O( v" K' e6 @, w4 ]8 t
else printf("No Euler path\n");: N, Q8 z0 a" D
getchar(); getchar();
1 c/ O" E6 j7 `1 u% k1 \return 0; } |
|