- 在线时间
- 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>: u* B9 a) T' L! v0 i5 l* G
#include <string.h>2 X# E y5 \/ K: d" |
struct stack
4 o W1 j c k3 j Q7 d9 C{int top , node[210];} f; //顶点的堆栈8 G8 P- c8 G. ^9 q# t0 P: g) {
int a[201][201]; //图的邻接矩阵
4 w1 ^/ S. |( f% a0 ?int n;
& z) D- @1 T7 @* K- b3 Y3 uvoid dfs(int x) //图的深度优先遍历3 r' F2 o e( q4 A) v4 D, P+ W
{int i;
. |6 O3 r' G- Q" l Nf.top ++; f.node[f.top] = x;
w6 d5 o' T& N2 \5 {) _" gfor (i = 1; i <= n; i ++)
/ b( m7 k" M( [4 g5 `if (a[i][x] > 0)) P+ s( M8 m8 [( K3 {4 R+ ^
{ a[i][x] = 0; a[x][i] = 0; //删除此边& g2 w4 f+ d2 C1 i4 f
dfs(i);
2 O- _0 v0 _7 Y' ^break; }
7 x3 U0 ]4 W( [5 F/ R" o/ T) o}) O; {& K* x4 x; F7 n. a/ c u# H4 i. G
void Euler(int x) //欧拉路算法
- i1 w1 U& I5 i* a" v* z4 d{int i , b;1 \! n3 ]2 L/ A- o0 @
f.top = 0; f.node[f.top] = x; //入栈
" S7 B5 x8 R& D' p$ ?/ ewhile (f.top >= 0)' X) U; K! v' {
{b = 0;
, g, R& P, B2 ]- E( ^: Y( f for (i = 1; i <= n; i ++) , t/ I3 v' J( w, Y9 J* l7 m
if (a[f.node[f.top]][i] > 0) ( l4 x7 ~$ h' G/ M8 d. V" I' F
{b = 1; break;}* H' G' d5 W# @8 p
if (b == 0) //如果没有点可以扩展,输出并出栈
2 V1 R4 V* Q3 l3 l3 W0 y6 g7 h5 _{ printf("%d " , f.node[f.top]);% x0 \ a( M7 v, W, I
f.top --;}) J6 X( j( k, N1 b4 D
else {f.top --; dfs(f.node[f.top+1]);} //如果有,就DFS0 ]* j$ C" p+ O* P
}+ ?: l( ?. u* S/ }
}) A* h' g# I0 l! [ R! p1 e9 a3 F
int main()
! d5 h- O7 M1 B" Y{; G/ V; R& ^# q9 P& g' t& ]
int m , s , t , num , i , j , start;
1 U8 Z2 _( B4 f9 h3 s# K, a //input
) c+ M6 F" T8 Y6 O( `. v5 t) Vscanf("%d %d" , &n , &m); //n顶点数 m边数; q$ E! `8 N; f7 _
memset(a , 0 , sizeof(a));
* w( j- b" |9 D# e Z z0 T for (i = 0; i < m; i ++)
, j7 j& {) R' A+ M9 z{printf("innput s,t");
. h4 w% a* A& I" A1 Y scanf("%d %d" , &s , &t);
& h/ ~6 |; {+ m4 e( Z$ ?0 z a[s][t] = 1; a[t][s] = 1;
$ O/ V+ Z/ p4 T3 ?}
4 U# L" w/ |: ~% i //判断是否存在欧拉回路
; f7 Z4 @4 \* `+ U/ l6 hs = 0; start = 1;( q }1 N2 ~2 |- M8 P: E0 W. m6 L
for (i = 1; i <= n; i ++) z/ @9 G7 t) C* f1 L/ N- ?+ A
{num = 0;/ T6 E1 a o2 q/ V3 m1 | w
for (j = 1; j <= n; j ++)
& l( T% M& h* s1 k5 b# F, n$ i num += a[i][j];
8 Y8 |* y- ]1 v/ H, D& ? if (num % 2 == 1) / {% W W ? U# l6 R$ s' Z, p4 k
{start = i; s ++;}: [4 T3 }3 A; |" j( P) w. e
}
( g! S3 I6 w) c6 v" |* Iif ((s == 0) || (s == 2))
! @8 l# o4 a& F) u' ~6 g; ^1 L% ZEuler(start);
& _/ b6 j# @/ S5 {2 B, U; R( \ else printf("No Euler path\n");
$ C8 j3 }# ^8 F+ g4 i/ Xgetchar(); getchar();
, @1 c5 Q, _: T+ P) Preturn 0; } |
|