- 在线时间
- 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>! B; S! c8 _. y
#include <string.h>* { H/ E0 D* F# ?5 U
struct stack0 n+ a, h. \+ A2 ?" y; X) Q
{int top , node[210];} f; //顶点的堆栈
7 T' R5 N6 S3 E5 f5 | b {; c+ u3 T% iint a[201][201]; //图的邻接矩阵) h: D# P& N. p
int n;
6 A: u9 V# m" z6 d+ |" } fvoid dfs(int x) //图的深度优先遍历' h( n7 [2 l, b! @
{int i;1 ^7 m M& I! A
f.top ++; f.node[f.top] = x;
5 c' ~4 @7 L) ^+ ifor (i = 1; i <= n; i ++) ~0 Q: J- U7 _2 N* @
if (a[i][x] > 0) m& P2 o- l8 W/ q
{ a[i][x] = 0; a[x][i] = 0; //删除此边4 v' T. m" @( @3 y; T: m
dfs(i);9 g4 l/ Z% z4 B5 G. P% S9 a h3 T. C
break; }, }" l; E% z M8 K/ |# O8 Q! d
}7 n/ L! R3 h! ~9 p9 p5 i D( ?% p
void Euler(int x) //欧拉路算法: G+ U& f3 w: C) ?8 T J
{int i , b;% ]2 c# }3 E! E/ A# V! M
f.top = 0; f.node[f.top] = x; //入栈
8 z$ t" j4 E1 x/ }! `- Fwhile (f.top >= 0)
- b, N) W& ~+ m. V+ z% E! y{b = 0;
7 i* {9 f5 f+ E* }7 b" A& ?" _* V for (i = 1; i <= n; i ++) 9 f( V% f+ x6 ~
if (a[f.node[f.top]][i] > 0) " M5 g2 Q* ~- h* e) b2 U( H
{b = 1; break;}& L0 K+ ]+ Y$ o' A8 h; @, }) ~
if (b == 0) //如果没有点可以扩展,输出并出栈& q8 L P% K) W* n" }
{ printf("%d " , f.node[f.top]);: ?# E: E/ O3 m" w) c/ v# i- H
f.top --;}
7 I Y- ^) k+ W! {6 aelse {f.top --; dfs(f.node[f.top+1]);} //如果有,就DFS
; L4 F" h+ B n X5 j}2 b3 r3 n' f2 A0 k9 Z
}4 }' j$ A: V, A) Q6 [
int main()! V1 w9 @4 Q( w# H6 e3 l% o" ?
{
+ k6 y3 X# N; e) G; y! rint m , s , t , num , i , j , start;6 _, A, i' E% ]$ c: o
//input ~4 {2 {4 m; m/ e8 P" I
scanf("%d %d" , &n , &m); //n顶点数 m边数
/ b& E5 S5 W( w7 P. g3 R8 c: wmemset(a , 0 , sizeof(a));" \$ ^! c. }9 x1 J+ f2 \
for (i = 0; i < m; i ++)* ]0 f" H5 V' d. F: {$ j! f
{printf("innput s,t"); B; j& Z: ?; j5 L
scanf("%d %d" , &s , &t); P) d; }& w9 M* d
a[s][t] = 1; a[t][s] = 1; {2 |" T% E4 G. w4 J
}" f+ @% w1 c D% ?1 m2 B$ d( \
//判断是否存在欧拉回路
5 D" U8 g! G$ ~* Y- T+ E6 A7 Qs = 0; start = 1;
3 P* X% e. R9 [! P$ | for (i = 1; i <= n; i ++)5 Q& m1 c8 |5 ]+ r' X
{num = 0;5 C, j. D3 F+ [: \
for (j = 1; j <= n; j ++)4 E' Q$ r/ P0 u9 o6 u+ @* _
num += a[i][j];+ S3 w* U7 V* Y' p1 ^/ z7 o
if (num % 2 == 1) 2 ?; D- P$ r2 Q6 s& k6 m: j% i
{start = i; s ++;}
6 Y6 W9 [, B1 j/ S- J- n}, |* J9 @! c! R' x+ R5 c7 J
if ((s == 0) || (s == 2)) # @! T6 J: O* M, ~$ W+ k: m5 y
Euler(start);
1 ^( J: \8 j! S* H else printf("No Euler path\n");
p. n6 B( U, n6 [' ggetchar(); getchar();
7 Y# P# X% K* T0 p% p; Oreturn 0; } |
|