SSL 1438 P2731 騎馬修柵欄

2021-10-13 03:45:23 字數 1947 閱讀 2854

john 是乙個與其他農民一樣懶的人。他討厭騎馬,因此從來不兩次經過乙個柵欄。

john 的農場上一共有m個柵欄,每乙個柵欄連線兩個頂點,頂點用1到500標號(雖然有的農場並沒有那麼多個頂點)。乙個頂點上至少連線1個柵欄,沒有上限。兩頂點間可能有多個柵欄。所有柵欄都是連通的(也就是你可以從任意乙個柵欄到達另外的所有柵欄)。john 能從任何乙個頂點(即兩個柵欄的交點)開始騎馬,在任意乙個頂點結束。

你需要求出輸出騎馬的路徑(用路上依次經過的頂點號碼表示),使每個柵欄都恰好被經過一次。如果存在多組可行的解,按照如下方式進行輸出:如果把輸出的路徑看成是乙個500進製的數,那麼當存在多組解的情況下,輸出500進製表示法中最小的乙個 (也就是輸出第一位較小的,如果還有多組解,輸出第二位較小的,以此類推)。

輸入資料保證至少有乙個解。

第一行乙個整數m,表示柵欄的數目。

從第二行到第(m+1)行,每行兩個整數u,v,表示有一條柵欄連線u,v兩個點。

共(m+1)行,每行乙個整數,依次表示路徑經過的頂點號。注意資料可能有多組解,但是只有上面題目要求的那一組解是認為正確的。

資料保證至少有一組可行解。

912

2334

4245

2556

5746

123

4254

657

對於100%的資料,1<=m<=1024,1<=u,v<=500。

這題很明顯是求一條字典序最短的迴路,一條迴路最多有兩個奇點,所以我們可以跑一趟dfs,注意要從奇點出發,但是還有乙個問題:

假如沒有奇點呢?

如以下資料:

31 2

2 31 3

沒有奇點就代表可以從任何一點出發,所以可以先設為1(洛谷第一篇題解)

但是雖然ac了,就一定對了嗎?

不!看從某大佬手中摘到的hack資料:

32 3

3 42 4

是不是差不多?

但是絕大部分題解輸出的是1

而題目中並沒有規定一定有1

那麼為什麼會ac呢?

大佬說:

資料中只有乙個點是沒有奇點的,那個點資料有1頂點,所以能過

所以蒟蒻在此修改:

改為mn(mn是全部頂點中最小的乙個)

19ms,吸氧後17ms(氧不行了?)

可以從某一本通上找來一筆畫的程式改一下(新增重邊)

進了第一頁就很不錯

#include

#include

using

namespace std;

int m,a[

510]

[510

],mx,mn=

500,q[

250010

],x,y,tot=

0,s;

intma

(int l,

int r)

intmi

(int l,

int r)

//懶得加iostream

bool t[

510]

,ok;

//記錄奇點

void

dfs(

int d)

//跑dfs,越暴力,越快樂

} q[

++tot]

=d;return;}

intmain()

s=mn;

for(

int i=mn;i<=mx;i++)if

(t[i]

)//第乙個奇點

printf

("%d"

,s);

dfs(s)

;for

(int i=m;i>=

1;i--

)printf

("\n%d"

,q[i]);

return0;

}

SSL 1438 騎馬修柵欄 P2731

time limit 1000ms memory limit 65536k total submit 108 accepted 43 農民john每年有很多柵欄要修理。他總是騎著馬穿過每乙個柵欄並修復它破損的地方。john是乙個與其他農民一樣懶的人。他討厭騎馬,因此從來不兩次經過乙個乙個柵欄。你必須...

洛谷P2731騎馬修柵欄

farmer john每年有很多柵欄要修理。他總是騎著馬穿過每乙個柵欄並修復它破損的地方。john是乙個與其他農民一樣懶的人。他討厭騎馬,因此從來不兩次經過乙個柵欄。你必須編乙個程式,讀入柵欄網路的描述,並計算出一條修柵欄的路徑,使每個柵欄都恰好被經過一次。john能從任何乙個頂點 即兩個柵欄的交點...

P2731 騎馬修柵欄 (尤拉路徑)

題目描述 john是乙個與其他農民一樣懶的人。他討厭騎馬,因此從來不兩次經過乙個柵欄。你必須編乙個程式,讀入柵欄網路的描述,並計算出一條修柵欄的路徑,使每個柵欄都恰好被經過一次。john能從任何乙個頂點 即兩個柵欄的交點 開始騎馬,在任意乙個頂點結束。每乙個柵欄連線兩個頂點,頂點用1到500標號 雖...