- 在线时间
- 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>6 `4 L$ W" X1 [2 E7 s% g% z' B
#include <string.h>
& o& U8 \# Y* k& T, f( b4 b' u4 q; Estruct stack. z' z C+ ~$ T8 J/ {& b) q) X& g2 C0 R
{int top , node[210];} f; //顶点的堆栈/ D5 h( M/ Z# d' U- d
int a[201][201]; //图的邻接矩阵5 ?/ a- l+ t4 E6 J
int n;. M, Z6 o: U! j) c
void dfs(int x) //图的深度优先遍历
1 o# E- h' n' ~! c{int i;% c3 ]% A' X. a/ J1 Z
f.top ++; f.node[f.top] = x;
: z, `% u4 x0 h6 f" rfor (i = 1; i <= n; i ++). N9 b. {' i/ S) g" x4 Z) r
if (a[i][x] > 0)
2 a# G. Q6 A3 d$ F { a[i][x] = 0; a[x][i] = 0; //删除此边
; D- P/ H _, F) i) D4 R. L4 [5 D! Gdfs(i);
/ W" l& n, B" w# [# m' sbreak; }
4 U3 P' e' d D Q7 y" l}
% d4 l3 c. f7 \7 u& uvoid Euler(int x) //欧拉路算法0 i" p$ V( z# m0 K8 H
{int i , b;' j# f+ D9 S& Q% |
f.top = 0; f.node[f.top] = x; //入栈: o& h C; m5 |! s( s: n
while (f.top >= 0)
3 q0 d$ Z4 p; B# Z, n! g$ s{b = 0;
" L, Z; @+ g# _3 o; x for (i = 1; i <= n; i ++) # Z* s. @* Q9 ~
if (a[f.node[f.top]][i] > 0) 5 }( j3 b, t0 m/ A9 B, S# G
{b = 1; break;}: e0 I7 l" d" q6 d- O; s' N. A
if (b == 0) //如果没有点可以扩展,输出并出栈
' w1 q3 D4 m/ _4 M+ s* H4 s6 D{ printf("%d " , f.node[f.top]);
2 Y0 g0 t( ~3 Q* ~$ f, d% u5 l f.top --;}" U7 y! ~6 Y6 m3 }! w
else {f.top --; dfs(f.node[f.top+1]);} //如果有,就DFS0 Y8 f2 {1 T. O' V- A+ R
}
. `1 m6 j; f) k& u6 m}
. C8 J9 P$ g+ T) Q6 g" E8 U, Zint main(); ?. V& b2 |. j/ s7 Y( q# W5 e
{& n0 m3 H5 z: b- v1 ]# ^0 P
int m , s , t , num , i , j , start;* r( \9 [7 A6 @4 r4 v
//input3 G! B% A9 \1 W0 `
scanf("%d %d" , &n , &m); //n顶点数 m边数
: K+ \, s1 K) e* A: a; wmemset(a , 0 , sizeof(a));0 o! C9 n3 L$ N2 G$ D5 ~- J
for (i = 0; i < m; i ++)9 m8 o# z% E, ?) d# V
{printf("innput s,t");
2 t0 u m0 t* W2 k0 i scanf("%d %d" , &s , &t);
( f, }2 Z8 P/ R! p a[s][t] = 1; a[t][s] = 1;
. n% t$ u6 g5 v- F; y, p8 M}
' d' ^! T l1 z0 r //判断是否存在欧拉回路
( k& S- G# s. }) d9 c/ _s = 0; start = 1;
& S( X% _* W) A3 r) O* C1 s for (i = 1; i <= n; i ++)
& `3 r# X# N J; W4 H3 p{num = 0;
- f/ j; T$ c1 d T/ cfor (j = 1; j <= n; j ++)
" o9 G, ^9 l+ [, y$ x num += a[i][j];
$ C5 C% `3 C* b if (num % 2 == 1)
7 M. k+ ~2 @; d( E/ U{start = i; s ++;}
- C% Z: u% J! t) X; l9 ~0 k}; _/ h/ B4 X( N5 x3 ?
if ((s == 0) || (s == 2)) 2 G7 _# }6 T ~2 f4 C1 e
Euler(start);
7 j3 d2 v7 P ^) b: G" H else printf("No Euler path\n");) v7 s% L) {1 f
getchar(); getchar();
. j9 E* r; A vreturn 0; } |
|