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標號 雖...