UOJ 488 尤拉迴路

2022-08-26 08:03:08 字數 1651 閱讀 7986

題目描述:

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

一共兩個子任務:

這張圖是無向圖。( 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 條邊的編號。

樣例輸入1:

3 31 2

2 31 3

樣例輸出1:

yes1 2 -3

樣例輸入2:

5 62 3

2 53 4

1 24 2

5 1樣例輸出2:

yes4 1 3 5 2 6

時間限制、資料範圍及描述:

1<=n<=10^5;0<=m<=2×10^5

思路:

尤拉迴路模板題

**:

#include#include#include#include#include#includeusing namespace std;

const int n=100010;

const int m=1000010;

bool flag[m];

int in[n],out[n];

int type,n,m,tot=1,x,y;

int head[n],ver[m],nxt[m];

vectorans;

void add(int u,int v)

void dfs(int x)

}int main ()

if(type==1)

} else

for(int i=1; i<=n; i++)

}for(int i=1; i<=n; i++)

if(head[i])

if(ans.size()!=m)

printf("yes\n");

for(int i=m-1; i>=0; i--)

printf("%d ",ans[i]);

printf("\n");

return 0;

}

488 尤拉迴路

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

尤拉迴路 UOJ117 尤拉迴路 題解

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

uoj 117 尤拉迴路

1.判斷是否為尤拉存在尤拉迴路 裸的判斷 尤拉迴路就是看一筆能不能把途中所有的邊跑完沒得重複 對於無向邊 建立雙向邊判斷每個點的入度是否為2的倍數 1.1 對於有向邊 建立單向邊判斷每個點的入度與出度是否相等 1.2 然後就是看一下是否所有的點是否連線 可以用並查集或者dfs判斷,具體看情況來定。2...