- 在线时间
- 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>
7 R* V/ u3 ]* d; c/ B#include <string.h>
- {. q( z0 f- dstruct stack
2 j J" b3 Z) H) y7 o. t- H{int top , node[210];} f; //顶点的堆栈
\! @, u# \+ k, `0 C2 K7 y3 ?int a[201][201]; //图的邻接矩阵
]* x; u: G+ ~; hint n;
5 C5 ~+ A4 c' O+ ]" avoid dfs(int x) //图的深度优先遍历
2 ?$ c* i) S2 X5 }0 u" z{int i;
# p, x$ G" o2 A) ef.top ++; f.node[f.top] = x;6 s; B2 Y6 M) j) H q. ~
for (i = 1; i <= n; i ++)* {/ \) v1 c9 g {$ Q1 y8 `& o. ]- `, t
if (a[i][x] > 0). G# s$ j5 m$ D$ t: x
{ a[i][x] = 0; a[x][i] = 0; //删除此边 ?1 K k( b' s$ |5 W7 T
dfs(i);
# n; N- E: }2 V& g6 u- z* Zbreak; }. N0 E: T( j- ]! V+ F1 w: v. p: H, ~
}& u$ k$ R8 k3 B5 p# o, x
void Euler(int x) //欧拉路算法
; F# w, s) R. w& B" j7 h+ Z{int i , b;9 U6 \& M8 y# k- b4 p
f.top = 0; f.node[f.top] = x; //入栈
9 \' O5 H" v H& i: T! Iwhile (f.top >= 0)
* @0 d2 }' i k2 m{b = 0;$ f- R+ r p; W0 b: p) `' r
for (i = 1; i <= n; i ++)
/ ^$ c* s4 |2 w- j- p. eif (a[f.node[f.top]][i] > 0) 0 ]$ o& o( L$ {5 H. h0 w
{b = 1; break;}- F" ^/ m+ z! |) T1 S
if (b == 0) //如果没有点可以扩展,输出并出栈7 L. V5 z" s, T: e, s! f3 m
{ printf("%d " , f.node[f.top]);5 ^+ G1 Y6 q- r* s
f.top --;}
% m' P1 L- m' [ M6 Gelse {f.top --; dfs(f.node[f.top+1]);} //如果有,就DFS) z8 ?6 C' a0 b& C$ B2 @3 B
}
# o( J4 @+ [ ~5 d}& H/ s2 E" j# Y6 ]9 ~
int main()
* s1 | k5 J# l8 F4 u3 a7 e{
( y0 t! V* b8 `+ J, x# \5 gint m , s , t , num , i , j , start;/ K" V( L. z! t% i
//input# p% `- x" P6 }2 B* ^3 r
scanf("%d %d" , &n , &m); //n顶点数 m边数+ V* l4 g% l7 G. t7 l- L- F( v
memset(a , 0 , sizeof(a));
% g0 [6 X- |7 W- u7 u; z for (i = 0; i < m; i ++)
# k! Y6 `/ R5 g0 @$ z* s{printf("innput s,t");
6 O8 R8 V5 K2 ?1 a) f( }0 k4 T scanf("%d %d" , &s , &t);% h6 a j& y3 |# y# e7 N, v) D u
a[s][t] = 1; a[t][s] = 1;; j4 j1 ] ~1 N3 b! r7 B
}
4 b4 q$ `# q- V& M1 m //判断是否存在欧拉回路
) e1 i* ?( t2 K# ` ?1 o/ _s = 0; start = 1;; s" Y" x6 V) @7 V4 K8 {7 a9 i
for (i = 1; i <= n; i ++)
; ^% ]5 u+ e, B4 p8 z% Z8 J{num = 0;
2 J+ k' o5 K6 ~0 ~for (j = 1; j <= n; j ++)" u+ U/ n; |, Q. A* ~/ v- T
num += a[i][j];
8 m. H2 D Z+ g# O9 _$ D. s if (num % 2 == 1)
0 W* W! V; h1 Y3 V3 \/ q{start = i; s ++;}
2 h5 W9 q& Y8 w3 u9 y}
9 G6 }# U5 P. G5 Y/ p2 L, k+ Aif ((s == 0) || (s == 2))
; H5 T7 V) x2 |Euler(start);
. |2 U' ?2 ^; N6 I% s1 c else printf("No Euler path\n");% I/ D2 w1 r0 W
getchar(); getchar();7 f8 V, k8 n( @. Y2 D1 k
return 0; } |
|