- 在线时间
- 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>) Z* m5 b0 ~2 S3 W5 F: A' a; \
#include <string.h>& u& X* v, v& b- m( g6 y5 t
struct stack/ p, q x# `3 U3 a1 e I
{int top , node[210];} f; //顶点的堆栈4 o! B" t- [6 d' `( |0 v
int a[201][201]; //图的邻接矩阵
# E, X( ]8 U+ s, `6 y: gint n;3 \7 V0 `. ^0 Y& o* T1 h" h5 ?9 O
void dfs(int x) //图的深度优先遍历% b9 o, k" i, A. e
{int i;" ]. r2 I$ G0 h% D# \' |
f.top ++; f.node[f.top] = x;, t7 o8 c7 ?& b
for (i = 1; i <= n; i ++)& T+ O/ k# |# s+ w& w) O$ O& z1 j
if (a[i][x] > 0)3 N1 A: B; v; p; q) a$ |4 |
{ a[i][x] = 0; a[x][i] = 0; //删除此边6 k. U$ n; \" [5 ^
dfs(i);4 G4 V' A4 `3 W3 m7 c) |
break; }
* o( h; P; M% r+ g}7 Y3 G$ J- h- E9 K* g7 R p
void Euler(int x) //欧拉路算法1 y! p9 _. j% Z/ Z
{int i , b;
0 j: a5 i4 ^9 F2 Sf.top = 0; f.node[f.top] = x; //入栈
( Q8 b1 B. P% }+ n: Wwhile (f.top >= 0) Z. }' c1 e( d5 w
{b = 0;5 o" A( Z; I4 p6 G) n8 ~
for (i = 1; i <= n; i ++)
5 `3 o9 x8 [ \, K. R* w$ mif (a[f.node[f.top]][i] > 0)
. t7 O9 ]4 a$ B7 J{b = 1; break;}$ i) O' {% \. S1 Y
if (b == 0) //如果没有点可以扩展,输出并出栈$ D) g: `& I4 V- r# ^0 j
{ printf("%d " , f.node[f.top]);
# N6 Z2 }5 H7 L f.top --;}
1 }, s3 ~% y. I7 C+ F2 a5 Helse {f.top --; dfs(f.node[f.top+1]);} //如果有,就DFS
' H+ [, A W( U6 R8 z. w& s L}$ h; Q/ _& x: `8 I- T2 J) I. x3 j
}
' S' G& l; z- N# U) c1 Vint main()4 g/ s9 K9 p. G) I; ~# H/ c/ R
{
! ]5 V% j- E' Q/ }# rint m , s , t , num , i , j , start;
) V" I" L2 U9 \ //input
( X7 ^, I; f/ ~7 i4 c, {- U1 |1 Kscanf("%d %d" , &n , &m); //n顶点数 m边数
( s3 E& Q$ `- Q% E7 P3 T+ y9 Mmemset(a , 0 , sizeof(a));
- r; U) O5 |6 s5 f1 ^' P for (i = 0; i < m; i ++); _. ]2 Y. Y; E5 ]4 ]8 O( _( [
{printf("innput s,t");* a8 O# ]! N |8 L5 |) G- d
scanf("%d %d" , &s , &t);
' F4 x4 k# A( W! D! t- r a[s][t] = 1; a[t][s] = 1;
4 s9 b3 n, w8 _% N- r8 M3 n( f}2 B# B; m5 w, x6 ?% ~2 E
//判断是否存在欧拉回路
, G7 v0 _8 M% ns = 0; start = 1;
7 J" Q$ R2 C1 p; w) H for (i = 1; i <= n; i ++), V f; _# {* |& A
{num = 0;! Y" \2 k6 M$ P8 m7 ? D
for (j = 1; j <= n; j ++)3 Q8 F, u2 `" `1 H7 Q& Z
num += a[i][j];+ q" Y- |7 ]/ U' G* b, a& k9 f8 f: ?
if (num % 2 == 1) j/ G7 ]# l- v0 V
{start = i; s ++;}& ^6 v! i8 f4 _8 M
}/ J& V8 s- a0 Y5 N+ d& G
if ((s == 0) || (s == 2))
4 \# b3 X1 c/ F# F7 F: S# x- \' Z, nEuler(start);
; F/ H/ S+ L* P( H else printf("No Euler path\n");
" h0 Y; H2 {: B! }( ]/ ~3 v' sgetchar(); getchar();- Z& _# L# z6 B1 q
return 0; } |
|