給出m
mm條邊,求出一條尤拉路,起點任意,終點任意,每條邊只經過一次。要求給出的尤拉路字典序最小。(1≤
m≤
1024,1
≤n
≤500
)(1\leq m\leq 1024,1\leq n\leq 500)
(1≤m≤1
024,
1≤n≤
500)
先總結一下有向圖、無向圖求尤拉路與尤拉迴路的性質
。
無向圖
:有且僅有兩個點度數為奇數則有尤拉路,所有點度數均為偶數則有尤拉迴路。
有向圖
:所有點入度=出度則有尤拉迴路。有且僅有兩個點入度不等於出度,且起點出度比入度大 1
11 ,終點入度比出度大 1
11 則有尤拉路。
演算法 —— hierholzer (解決無向圖、有向圖、尤拉路、尤拉迴路問題)
選乙個點x
xx為起點,存在邊 ,
yx,y
x,y>,則刪去邊,
yx,y
x,y>,若為無向圖還需刪除,
xy,x
y,x>。若無邊可走,則將x
xx加入結果棧。最後輸出結構棧即可。
回到此題,要求找到字典序最小的尤拉路。因此選擇乙個編號最小的奇數點進行遞迴,遞迴過程中優先走字典序更小的點,可以用mul
tise
tmultiset
multis
et維護。
#include
#include
#include
#include
#include
#include
#define __ ios::sync_with_stdio(0);cin.tie(0);cout.tie(0)
#define rep(i,a,b) for(int i = a; i <= b; i++)
#define log1(x1,x2) cout << x1 << ": " << x2 << endl;
#define log2(x1,x2,y1,y2) cout << x1 << ": " << x2 << " , " << y1 << ": " << y2 << endl;
#define log3(x1,x2,y1,y2,z1,z2) cout << x1 << ": " << x2 << " , " << y1 << ": " << y2 << " , " << z1 << ": " << z2 << endl;
typedef
long
long ll;
typedef
double db;
const
int n =
500+
100;
const
int m =
1e5+
100;
const db eps =
1e-9
;using
namespace std;
multiset<
int> st[n]
;stack<
int> stk;
int m,deg[n]
;void
dfs(
int x)
stk.
push
(x);
}int
main()
int x =-1
;rep
(i,0
,500)if
(deg[i]%2
)if(x ==-1
) x =1;
dfs(x)
;while
(stk.
size()
)return0;
}
洛谷P2731騎馬修柵欄
farmer john每年有很多柵欄要修理。他總是騎著馬穿過每乙個柵欄並修復它破損的地方。john是乙個與其他農民一樣懶的人。他討厭騎馬,因此從來不兩次經過乙個柵欄。你必須編乙個程式,讀入柵欄網路的描述,並計算出一條修柵欄的路徑,使每個柵欄都恰好被經過一次。john能從任何乙個頂點 即兩個柵欄的交點...
P2731 騎馬修柵欄 (尤拉路徑)
題目描述 john是乙個與其他農民一樣懶的人。他討厭騎馬,因此從來不兩次經過乙個柵欄。你必須編乙個程式,讀入柵欄網路的描述,並計算出一條修柵欄的路徑,使每個柵欄都恰好被經過一次。john能從任何乙個頂點 即兩個柵欄的交點 開始騎馬,在任意乙個頂點結束。每乙個柵欄連線兩個頂點,頂點用1到500標號 雖...
P2731 騎馬修柵欄 尤拉函式
farmer john每年有很多柵欄要修理。他總是騎著馬穿過每乙個柵欄並修復它破損的地方。john是乙個與其他農民一樣懶的人。他討厭騎馬,因此從來不兩次經過乙個柵欄。你必須編乙個程式,讀入柵欄網路的描述,並計算出一條修柵欄的路徑,使每個柵欄都恰好被經過一次。john能從任何乙個頂點 即兩個柵欄的交點...