- 在线时间
- 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 W" a7 s8 W+ b4 |#include <string.h>: @5 o1 w; J. t! C
struct stack
4 q( a O; G& D) K1 T1 P{int top , node[210];} f; //顶点的堆栈/ b- ~4 g3 `( @. q8 O9 m9 M2 F
int a[201][201]; //图的邻接矩阵
5 j5 ~4 G; G# T0 ]int n;
?( z' c) j, |$ Z$ pvoid dfs(int x) //图的深度优先遍历+ l& o1 t. t8 V" m9 u- K) y1 M
{int i;7 r) G% A$ E: o4 o
f.top ++; f.node[f.top] = x;
/ @( \* X" G. G2 f8 b$ Ffor (i = 1; i <= n; i ++): U! z% C* L) P- _1 Z1 {
if (a[i][x] > 0)! m1 v0 K; y' y; s
{ a[i][x] = 0; a[x][i] = 0; //删除此边
6 P8 J# @9 y. Fdfs(i); F; i6 {. K8 Z6 B/ c% i5 g9 G6 e
break; }! Y7 t9 ~' E9 ]: ~ V- O
}
0 [! U/ g/ P* h- E Bvoid Euler(int x) //欧拉路算法3 M" l6 t1 I/ r: p
{int i , b;
2 M- S2 r' z; s; g# L' Bf.top = 0; f.node[f.top] = x; //入栈
3 i% [! b$ L6 p! L3 Iwhile (f.top >= 0)
3 O8 m `3 y* L5 j. m{b = 0;
+ v7 k" F/ w4 o6 J. |! @$ u- J for (i = 1; i <= n; i ++)
- k, K' j* T* vif (a[f.node[f.top]][i] > 0)
: y7 J/ i# J& ~% t5 o. f- \{b = 1; break;}5 Q5 \8 s& U" i; a, h ^
if (b == 0) //如果没有点可以扩展,输出并出栈$ X! b/ l Z" d- m/ u* f
{ printf("%d " , f.node[f.top]);) o5 o+ e' X4 l( h4 e( I0 H. H6 C- i
f.top --;}/ l3 t c8 v8 h* n5 W. ?1 U
else {f.top --; dfs(f.node[f.top+1]);} //如果有,就DFS
# |5 Y' K- @9 w! Z6 O4 \}
+ E1 M' {& S- N" P' R}
6 x. L" V4 J5 a! r) B' @% qint main()
; l6 V2 i7 s" N+ t, V, H% g6 D3 |{* K- A8 L$ {9 C8 x8 m* G8 F
int m , s , t , num , i , j , start;
6 Y+ V. H8 Q# ~& b0 ` //input# U( @+ Z4 u+ b) G0 A" O
scanf("%d %d" , &n , &m); //n顶点数 m边数
3 }9 t* h0 k9 O0 l$ c8 u' rmemset(a , 0 , sizeof(a));
4 ~, {: U. t/ R) ]3 Z4 i for (i = 0; i < m; i ++)9 E7 i0 g: F% P" O) p
{printf("innput s,t");
6 W& w$ [6 I! P5 v scanf("%d %d" , &s , &t);
; O+ ^7 t! w/ A ^ a[s][t] = 1; a[t][s] = 1;2 Z8 Q ^) ]& t1 n/ b/ {0 K
}
) \. S' M. C7 G+ I; p //判断是否存在欧拉回路
' d: T$ Q. h4 A. u* v" H1 Y- es = 0; start = 1;9 ]4 ]# w; r. D" H
for (i = 1; i <= n; i ++)+ o: L1 l4 b. O6 \
{num = 0;6 j" Z' p9 d) W! ~
for (j = 1; j <= n; j ++)# J: _! L/ J. S: K2 N
num += a[i][j];
3 Y1 q% K% a( J- M5 ^1 s if (num % 2 == 1) ( n$ ]$ y* r6 Y6 d4 c5 d1 B
{start = i; s ++;}
" \$ Z6 T( O; W" _2 x} s/ p7 j9 p1 H: r+ [& G7 @4 u
if ((s == 0) || (s == 2))
O8 s9 d7 n; B: N* m. v9 l7 VEuler(start);4 ]; `/ b' e5 E- ?& E7 X
else printf("No Euler path\n");$ q7 @# I6 | Q. g% o6 U
getchar(); getchar();4 W/ \8 K7 \9 P3 m+ E, k
return 0; } |
|