騎馬修柵欄題解

2021-08-06 07:40:43 字數 1381 閱讀 8768

最近在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:

9

1 22 3

3 44 2

4 52 5

5 65 7

4 6

輸出樣例#1:

123

4254

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能從任何乙個頂...