有一天一位靈魂畫師畫了一張圖,現在要你找出尤拉迴路,即在圖中找乙個環使得每條邊都在環上出現恰好一次。
一共兩個子任務:
這張圖是無向圖。( 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,一條邊走過後就刪除。回溯時將其入隊。最後的佇列反過來就是答案。原理 最後的佇列是返回路徑,所以反過來就是答案。...