luoguP2731 騎馬修柵欄 題解

2021-08-08 03:52:41 字數 1782 閱讀 7157

題目背景

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 2

2 3

3 4

4 2

4 5

2 5

5 6

5 7

4 6

輸出樣例#1:

1 2

3 4

2 5

4 6

5 7

說明題目翻譯來自nocow。

usaco training section 3.3

我們讀題可以發現,這道題目是圖的遍歷問題,而且遍歷的是無向圖的邊(就是要經過每一條柵欄),用深度優先遍歷就可以了。

這道題目坑點很多。

詳見**注釋

#include

int a[2000][2000]={};

//a陣列用來儲存i和j之間的邊數。

int n,du[2000]={},ans[2000]={},top;//du陣列用來統計度數(尤拉路的遍歷問題一定要統計度數,因為存在奇點的時候一定是從乙個奇點出發,回到另外乙個奇點)不會尤拉路的可以看看一本通的例題。。ans陣列是用來記錄路徑的。top用來記錄ans陣列內的元素個數,便於輸出。

void read()

return;

}//read函式是用來初始化和讀入資料的

int dfs(int k)

ans[++top]=k;//記錄路徑

}//dfs函式:用來深度優先遍歷所有的邊

void print()

//列印輸出解,我們在dfs函式中可以看到,我是最後才記錄路徑的,因此路徑在ans陣列重視倒序儲存的。

int main()

//如果存在尤拉迴路,就從第乙個有度數的點開始(1、符合題目處理多組解的要求;2、任意乙個點開始深搜)

for(int i=1;i<=500;i++)

if(du[i]%2==1)

//判斷是否存在奇點,如果有就要從該點開始深搜。

dfs(k);

//開始深搜

print();

//輸出解

return

0;}

SSL 1438 P2731 騎馬修柵欄

john 是乙個與其他農民一樣懶的人。他討厭騎馬,因此從來不兩次經過乙個柵欄。john 的農場上一共有m個柵欄,每乙個柵欄連線兩個頂點,頂點用1到500標號 雖然有的農場並沒有那麼多個頂點 乙個頂點上至少連線1個柵欄,沒有上限。兩頂點間可能有多個柵欄。所有柵欄都是連通的 也就是你可以從任意乙個柵欄到...

洛谷P2731騎馬修柵欄

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

騎馬修柵欄

對剛學的尤拉迴路的練習。錯點 萬一是尤拉路徑不是尤拉迴路的話,不能只選乙個最小的點當起點。要選度數為奇數的兩個點中較小的乙個。2.1 不一定在連通圖內,不能單純的把 1 當做起點。3.見 中的注釋。include include include includeusing namespace std ...