488 尤拉迴路

2021-09-25 05:16:27 字數 2114 閱讀 8518

有一天一位靈魂畫師畫了一張圖,現在要你找出尤拉迴路,即在圖中找乙個環使得每條邊都在環上出現恰好一次。

一共兩個子任務:

這張圖是無向圖。( 50分)

這張圖是有向圖。( 50分)

第一行乙個整數 t,表示子任務編號。t∈,如果 t=1則表示處理無向圖的情況,如果 t=2則表示處理有向圖的情況。

第二行兩個整數 n,m,表示圖的結點數和邊數。

接下來 m 行中,第 i 行兩個整數 vi,ui,表示第 i 條邊(從 1 開始編號)。保證 1≤vi,ui≤n。

如果 t=1 則表示 vi 到 ui 有一條無向邊。

如果 t=2 則表示 vi 到 ui 有一條有向邊。

圖中可能有重邊也可能有自環。

如果不可以一筆畫,輸出一行 「no」。

否則,輸出一行 「yes」,接下來一行輸出一組方案。

如果 t=1,輸出 mm 個整數 p1,p2,…,pm。令 e=|pi|,那麼 e 表示經過的第 i 條邊的編號。如果 pi 為正數表示從 ve 走到 ue,否則表示從 ue 走到 ve。

如果 t=2,輸出 m 個整數 p1,p2,…,pm。其中 pi 表示經過的第 i 條邊的編號。

133

1223

13

yes12

-3

256

2325

3412

4251

yes41

3526

#include

#define m(a,b) memset(a,b,sizeof(a))

using

namespace std;

int t,n,m,x,y,cur;

int head[

1000010

],sum[

1000010

],adj[

1000010

],cnt=1;

bool vis[

1000010];

struct sdt

e[4001000];

stack<

int>s;

inline

void

read

(int

&x)while

(ch>=

'0'&& ch<=

'9')

if(c==

'-')x=

-x;}

inline

void

add(

int x,

int y)

inline

intgets

(int x)

void

dfs1

(int x)

else adj[x]

=e[adj[x]

].nxt;}}

inline

bool

solve1()

for(

int i=

1;i<=n;i++

)for

(int i=

1;i<=n;i++)}

if(cur!=m)

return0;

else

return1;

}void

dfs2

(int x)

else adj[x]

=e[adj[x]

].nxt;}}

inline

bool

solve2()

for(

int i=

1;i<=n;i++

)for

(int i=

1;i<=n;i++)}

if(cur!=cnt-1)

return0;

else

return1;

}int

main()

else

printf

("\n");

}}else

else

printf

("\n");

}}return0;

}

UOJ 488 尤拉迴路

題目描述 有一天一位靈魂畫師畫了一張圖,現在要你找出尤拉迴路,即在圖中找乙個環使得每條邊都在環上出現恰好一次。一共兩個子任務 這張圖是無向圖。50分 這張圖是有向圖。50分 輸入描述 第一行乙個整數 t,表示子任務編號。t 如果 t 1則表示處理無向圖的情況,如果 t 2則表示處理有向圖的情況。第二...

尤拉迴路 輸出尤拉迴路的路徑

有向or無向均可,重邊 step1 從u開始,找到與他相連的v,放入棧,刪除 u,v 這條邊,然後從v開始 step2 當有一點沒有與他相連的點時,放入path,然後從stack取棧頂繼續開始找點刪邊。最後記得把棧裡的點放到path中。path倒序輸出 需要先找到起點 鄰接表法,適合稀疏圖 incl...

尤拉迴路 UOJ117 尤拉迴路 題解

判斷無向圖和有向圖是不是尤拉迴路。如果是,求出任意一條尤拉迴路。判斷尤拉迴路 證明?我不會啊!怎麼求尤拉迴路呢?因為已經確定了是尤拉迴路,所以我們可以直接dfs瞎搞。隨便從乙個點開始dfs,一條邊走過後就刪除。回溯時將其入隊。最後的佇列反過來就是答案。原理 最後的佇列是返回路徑,所以反過來就是答案。...