- 在线时间
- 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>
( Q' d: n& L. ~#include <string.h>4 E. y) L3 g% z5 F" I4 s; v6 n5 K7 W
struct stack
) |- P' L$ L) K1 b{int top , node[210];} f; //顶点的堆栈# D2 J# Z4 l' V# K( Y( u! H7 d0 j
int a[201][201]; //图的邻接矩阵 ]) E- t5 ]% k" t
int n;
! ~# m4 E3 w0 w( o$ ~) V. mvoid dfs(int x) //图的深度优先遍历- o4 T1 S) x# @) R2 b
{int i;4 D: c5 t: a- t' h' Y/ G* V+ ]- q4 r7 n
f.top ++; f.node[f.top] = x;% m( r0 y. \9 ]8 s# c
for (i = 1; i <= n; i ++)
7 w" p+ N+ c, n2 I* s, Uif (a[i][x] > 0)
* z2 d/ ^; S: U { a[i][x] = 0; a[x][i] = 0; //删除此边
! ?- Y$ s- E3 X2 i- t3 xdfs(i);
" o' z: i9 ^! Q' B9 @break; }
" V' l% g0 G' b# b9 S}# K+ V) g+ u3 B% v- l5 {
void Euler(int x) //欧拉路算法
. a) @3 H' f: g8 Y{int i , b;; f4 U! n+ [5 c9 P
f.top = 0; f.node[f.top] = x; //入栈
( @5 u; G' w. h$ k$ r- }4 fwhile (f.top >= 0)
& a* O! L7 ` y{b = 0;
7 B: [4 _0 d( `! g( f% ?, d for (i = 1; i <= n; i ++)
) a3 S1 Y$ B' `% P# ?if (a[f.node[f.top]][i] > 0) 8 e( q. f7 k' f
{b = 1; break;}
3 u+ l* K, p) V) \# y if (b == 0) //如果没有点可以扩展,输出并出栈
. k8 B8 m% T3 \' x) {: I$ o7 u{ printf("%d " , f.node[f.top]);
7 E# H( c2 G6 k# E/ }3 p$ j( e f.top --;}
! ^! Z3 M$ L* V) U- @- @; pelse {f.top --; dfs(f.node[f.top+1]);} //如果有,就DFS/ ?7 c* j) R" K% {
}
2 D5 R' V* Y y2 W* W}4 I& L. E: k. z9 \( X8 z
int main()$ u5 W% O3 f Y# m L- v; w: ]+ k, t
{# ?1 u- {" s: u# n% G$ K" t
int m , s , t , num , i , j , start;. ~8 {' R* g/ A( C9 C7 I/ J& N
//input; D! g4 g5 O' W3 k* s
scanf("%d %d" , &n , &m); //n顶点数 m边数
$ }9 o' X1 X( R0 V1 Dmemset(a , 0 , sizeof(a));
% ~: z1 c9 P/ k6 x D2 k for (i = 0; i < m; i ++)9 z# `/ s4 u! Y7 A
{printf("innput s,t");
/ i* b2 n, |7 V ^ scanf("%d %d" , &s , &t);. g' }! X. A$ S
a[s][t] = 1; a[t][s] = 1;
: C! ~3 P) G& o# e6 J}( V" H1 i' e: p' l: C& n9 \
//判断是否存在欧拉回路
$ [4 \8 p1 }1 K. X7 I5 [s = 0; start = 1;# N) A6 f' W4 N) U+ L, z
for (i = 1; i <= n; i ++)
a$ j. V9 P3 v; b0 |{num = 0;$ V9 f; S5 }4 E0 j8 t
for (j = 1; j <= n; j ++). V9 m% t: P% w b
num += a[i][j];- V! J9 H* Q: w5 ^# Y
if (num % 2 == 1) , v7 Q1 [, ? d, ?
{start = i; s ++;}, f( P. M1 U4 e' l/ L5 r
}, k# L, n/ z$ l! g/ m
if ((s == 0) || (s == 2)) 6 K7 s% p7 b5 l' W
Euler(start);( y+ d- U) L! N! ^: @
else printf("No Euler path\n");+ u0 R! o2 E" D5 [1 b
getchar(); getchar();
6 o8 U) U: J5 n7 [' s+ r- D: q1 jreturn 0; } |
|