最近在luogu做了一道叫烏鴉坐飛機騎馬修柵欄的題。
farmer john每年有很多柵欄要修理。他總是騎著馬穿過每乙個柵欄並修復它破損的地方。
john是乙個與其他農民一樣懶的人。他討厭騎馬,因此從來不兩次經過乙個柵欄。你必須編乙個程式,讀入柵欄網路的描述,並計算出一條修柵欄的路徑,使每個柵欄都恰好被經過一次。john能從任何乙個頂點(即兩個柵欄的交點)開始騎馬,在任意乙個頂點結束。
每乙個柵欄連線兩個頂點,頂點用1到500標號(雖然有的農場並沒有500個頂點)。乙個頂點上可連線任意多(>=1)個柵欄。兩頂點間可能有多個柵欄。所有柵欄都是連通的(也就是你可以從任意乙個柵欄到達另外的所有柵欄)。
你的程式必須輸出騎馬的路徑(用路上依次經過的頂點號碼表示)。我們如果把輸出的路徑看成是乙個500進製的數,那麼當存在多組解的情況下,輸出500進製表示法中最小的乙個 (也就是輸出第一位較小的,如果還有多組解,輸出第二位較小的,等等)。
輸入資料保證至少有乙個解。
輸入格式:
第1行: 乙個整數f(1 <= f <= 1024),表示柵欄的數目
第2到f+1行: 每行兩個整數i, j(1 <= i,j <= 500)表示這條柵欄連線i與j號頂點。
輸出格式:
輸出應當有f+1行,每行乙個整數,依次表示路徑經過的頂點號。注意資料可能有多組解,但是只有上面題目要求的那一組解是認為正確的。
輸入樣例#1:
91 22 3
3 44 2
4 52 5
5 65 7
4 6
輸出樣例#1:
1234254
657
尤拉迴路板子+計數就可以了,陣列記得開大點,聽同學說開到1025就夠了
#include
#include
using
namespace
std;
int g[1501][1501],du[1501],cu[1501];//一開始陣列開500wa了最後乙個
int n,e,ctp,i,j,x,y,st=1,m,mi,p;
void
f(int i)
cu[++ctp]=i;
}//尤拉迴路板子
intmain
()//我怕資料不從1開始就統計了最大和最小qaq,但貌似只需要統計最大值就好了
for(i=mi;i<=m;++i)
if(du[i]%2)
//找到最小的奇點就跳出迴圈並開始搜尋
f(st);
for(i=ctp;i>=1;--i)//記得反序輸出
printf("%d\n",cu[i]);
return
0;}
騎馬修柵欄
對剛學的尤拉迴路的練習。錯點 萬一是尤拉路徑不是尤拉迴路的話,不能只選乙個最小的點當起點。要選度數為奇數的兩個點中較小的乙個。2.1 不一定在連通圖內,不能單純的把 1 當做起點。3.見 中的注釋。include include include includeusing namespace std ...
騎馬修柵欄 Riding the Fences
可以按正常的輸入然後存入map陣列 ps 如果你用的是萬能頭就不要定義map陣列啦,可以定義乙個f陣列什麼的 這裡就出現和一本通上一筆畫的差距了,是累減,每次記錄就加一而不是賦值為1 因為後面很多地方需要用到點的個數,但是卻沒有輸入所以專門定義乙個maxn來找輸入的最大值就是點的個數啦 includ...
luoguP2731 騎馬修柵欄 題解
題目背景 farmer john每年有很多柵欄要修理。他總是騎著馬穿過每乙個柵欄並修復它破損的地方。題目描述 john是乙個與其他農民一樣懶的人。他討厭騎馬,因此從來不兩次經過乙個柵欄。你必須編乙個程式,讀入柵欄網路的描述,並計算出一條修柵欄的路徑,使每個柵欄都恰好被經過一次。john能從任何乙個頂...