poj1041 無向圖歐拉回路 按最小升序輸出


John's trip

這道題很不錯,由於圖已經保證連通,首先用度數是否是偶數,判斷圖是否是歐拉圖,然后,輸出最小升序,就成了一大難題,百科上有代碼,這題讓我理解了深搜的又一強大功能,其實就是每次都從小往大的搜,先搜得一個最小序環,然后對環上的每一點進行搜索,其實對於歐拉圖而言,每個點要么就只剩一個點,什么也搜不到了,要么還有一個環,只要把環上路徑全都插入到對應位置上,用棧存路徑,每次只有回溯到當前點,就是說當前點的后繼都已經搜過了的時候,才把當前點入棧,這樣一來倒着輸出,就能得到一個歐拉回路,而且是最小升序。

  
  
  
void dfs( int u){
int i, v, e;
for (i = 1 ; i <= num[u]; i ++ ){
e
= adj[u][i];
if ( ! mark[e]){
v
= map[u][e];
mark[e]
= 1 ;
dfs(v);
stk[
++ top] = e;
}
}
}

就是這樣一個代碼,就能實現歐拉回路的輸出,唯一一點特別的就是,stk[++top] = e,是在v點搜完了才執行的,想想就知道這有什么含義,這樣才是真正的最小序歐拉回路。實現代碼見下:

代碼
   
   
   
#include < stdio.h >
#include
< stdlib.h >
#include
< string .h >

#define NN 46
#define MM 1998

int map[NN][MM]; // map[u][e] = v,表示點u通過邊e連接到v
int adj[NN][MM]; // adj[u][i] = e,表示u的第i條臨邊是e
int num[NN]; // 記錄每個點的臨邊條數
int mark[MM];
int stk[MM]; // 記錄歐拉路徑
int idx, S, top;

int Min( int x, int y){
return x < y ? x : y;
}

int cmp( const void * a, const void * b){
return * ( int * )a - * ( int * )b;
}

void dfs( int u){
int i, v, e;
for (i = 1 ; i <= num[u]; i ++ ){
e
= adj[u][i];
if ( ! mark[e]){
v
= map[u][e];
mark[e]
= 1 ;
dfs(v);
stk[
++ top] = e;
}
}
}
int main()
{
int x, y, z, i, maxN;
while (scanf( " %d%d " , & x, & y) != EOF){
if (x == 0 && y == 0 ) break ;
memset(num,
0 , sizeof (num));
scanf(
" %d " , & z);
S
= Min(x, y);
adj[x][
++ num[x]] = z;
adj[y][
++ num[y]] = z;
map[x][z]
= y;
map[y][z]
= x;
while (scanf( " %d%d " , & x, & y) != EOF){
if (x == 0 && y == 0 ) break ;
scanf(
" %d " , & z);
adj[x][
++ num[x]] = z;
adj[y][
++ num[y]] = z;
map[x][z]
= y;
map[y][z]
= x;
}
for (i = 1 ;; i ++ ){
if (num[i] == 0 ) break ;
if (num[i] & 1 ) break ;
}
if (num[i] != 0 ){
puts(
" Round trip does not exist. " );
continue ;
}
maxN
= i - 1 ;
for (i = 1 ; i <= maxN; i ++ ){ // 對點i的臨邊排序
qsort(adj[i] + 1 , num[i], sizeof ( int ), cmp);
}
memset(mark,
0 , sizeof (mark));
top
= 0 ;
dfs(S);
for (i = top; i > 1 ; i -- ){
printf(
" %d " , stk[i]);
}
printf(
" %d\n " , stk[i]);
}
return 0 ;
}

 


注意!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。



 
粤ICP备14056181号  © 2014-2021 ITdaan.com