題目描述:
有一天一位靈魂畫師畫了一張圖,現在要你找出尤拉迴路,即在圖中找乙個環使得每條邊都在環上出現恰好一次。
一共兩個子任務:
這張圖是無向圖。( 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...