- 在线时间
- 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/ t8 d: Z( M9 |0 _- [
#include <string.h>
0 H) ?, j6 j$ { s3 k9 e: w, \struct stack4 B# M J- e# f. s2 M
{int top , node[210];} f; //顶点的堆栈9 T x/ [9 ?/ P
int a[201][201]; //图的邻接矩阵$ x% M- W6 {# c1 |
int n;" b9 S8 n: d! M2 B0 l
void dfs(int x) //图的深度优先遍历& R$ q6 f7 A+ b7 P
{int i;" ~0 f. K* ^( c- `; \ Z/ Q6 K
f.top ++; f.node[f.top] = x;
6 z0 S1 E' }8 ]; W% t& j% `3 Ufor (i = 1; i <= n; i ++)) |* h2 K! q7 f- a3 S
if (a[i][x] > 0), t5 N# j+ m! C3 i3 m S; [
{ a[i][x] = 0; a[x][i] = 0; //删除此边
9 D7 y+ X M, Z: z9 {4 }8 wdfs(i); R+ g/ o* W$ c% B4 |
break; }
2 f5 h O- |; V* e9 ?; n+ y}
5 }9 k$ p# U7 ~: F0 y7 m7 u- Hvoid Euler(int x) //欧拉路算法
7 x- }/ G8 r# A$ A! _; e{int i , b;9 U7 k7 P* p4 \9 a0 ~1 z
f.top = 0; f.node[f.top] = x; //入栈: I/ Q6 ~4 t, l
while (f.top >= 0)8 e+ f% ?4 T4 g6 P5 f
{b = 0;1 H6 w R- j6 w
for (i = 1; i <= n; i ++) 2 F' o: {+ b+ Y2 ]# @0 c6 @
if (a[f.node[f.top]][i] > 0) 7 o2 e2 N, b! J j9 m
{b = 1; break;}6 }% R' e' j. }, X
if (b == 0) //如果没有点可以扩展,输出并出栈
1 L+ @8 d" U9 y3 y5 X) ~+ z t6 n{ printf("%d " , f.node[f.top]);0 X6 N: A* P- x' K7 e0 u; E Z, A. y3 n
f.top --;}' O* h$ P" R0 a. D
else {f.top --; dfs(f.node[f.top+1]);} //如果有,就DFS! |2 p* G8 M# ~5 k
}& s! F. ?. c. {# q
}
0 `6 v( ^, g2 ?int main()
% |* f+ d. u+ n$ a6 R, `{. E* F# ]8 a5 x Q/ q k
int m , s , t , num , i , j , start;
+ z2 @8 v, S1 C2 l5 N4 I2 j6 ^; p# v //input6 @8 K0 i z/ X$ g
scanf("%d %d" , &n , &m); //n顶点数 m边数
( e5 h V* d9 ememset(a , 0 , sizeof(a));# q6 n5 l# [, ?% ?; u) O- a N
for (i = 0; i < m; i ++)+ ^& B( M3 m7 s* M9 a
{printf("innput s,t");% D7 C. \+ b' B8 M& K. ?
scanf("%d %d" , &s , &t);* h. ^0 N5 q+ H9 R+ J
a[s][t] = 1; a[t][s] = 1;
0 ~7 w8 G% Q2 W+ q4 D' |# O# g}. G' S% Z! g) V* R, |! N, N
//判断是否存在欧拉回路; p3 D! A: e7 d
s = 0; start = 1;+ Y! O) h! {) y/ I4 ]3 {( J2 r! A g
for (i = 1; i <= n; i ++)
9 S9 ?( l' T0 m8 h3 H4 D+ Q{num = 0;
- b3 `% Y: y# Z* c1 A$ R) E, Jfor (j = 1; j <= n; j ++)
7 Y. o; U( h4 G; k) q4 ]* |& b: a num += a[i][j];( x. b9 N3 q( o* L
if (num % 2 == 1) ; p. w2 z( F* B% Z$ J
{start = i; s ++;}& M7 u( }! }6 \. ?: X: \& y" |& e
}
( w( Q7 a& A3 W7 O7 ]- M% Mif ((s == 0) || (s == 2)) : {. B) F/ w D6 m2 q
Euler(start);1 R3 \' f5 k. ?1 Q
else printf("No Euler path\n");
# r" i1 \ T. d9 `+ a6 ggetchar(); getchar();& a% q* Y, L$ B+ f, V) v) i
return 0; } |
|