洛谷 P2731 騎馬修柵欄 尤拉路與尤拉迴路

2021-09-20 03:55:25 字數 1888 閱讀 7289

給出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能從任何乙個頂點 即兩個柵欄的交點...