鏟雪車 騎馬修柵欄 (尤拉路徑和尤拉迴路)

2021-10-02 23:41:26 字數 3317 閱讀 1729

今天上午的訓練賽涉及到的,順便補一下叭。

相信大家都聽說過著名的七橋問題,而尤拉迴路就是偉大的數學家尤拉為了解決七橋問題提出的。

首先介紹一下基本概念:在乙個圖中,經過每條邊一次並且只經過一次的迴路被稱為尤拉迴路,路徑被稱為尤拉路徑。根據名字就可以知道,迴路是起點終點相同的,而路徑是起點終點不同的。

其實尤拉路徑就是小時候玩的一筆畫遊戲(真是萬物皆可圖論)

特性:起點和終點的度都是奇數,中間點的度數必是偶數

結論:

1.在無向圖中,所有邊都連通:

(1)存在尤拉路徑的充要條件:所有點度數為奇數的點只能有0或2個

(2)存在尤拉迴路(起點和終點重合)的充要條件:度數為奇數的點只能有0個

2.在有向圖中,所有邊都連通:

(1)存在尤拉路徑的充要條件:要麼所有點的出度均等於入度;要麼除了兩個點之外,其餘所有點的出度等於入度,剩餘兩個點:乙個出度比入度多1,另乙個入度比出度多1.

(2)存在尤拉迴路(起點和終點重合)的充要條件:所有點的出度均等於入度。

結論很好證明的,在此不多做敘述。

鏟雪車

題目描述

隨著白天越來越短夜晚越來越長,我們不得不考慮剷雪問題了。整個城市所有的道路都是雙車道,因為城市預算的削減,整個城市只有1輛鏟雪車。鏟雪車只能把它開過的地方(車道)的雪鏟乾淨,無論哪兒有雪,鏟雪車都得從停放的地方出發,遊歷整個城市的街道。現在的問題是:最少要花多少時間去鏟掉所有道路上的雪呢?

輸入

輸入資料的第1行表示鏟雪車的停放座標(x,y),x,y為整數,單位為公尺。下面最多有100行,每行給出了一條街道的起點座標和終點座標,所有街道都是筆直的,且都是雙向乙個車道。鏟雪車可以在任意交叉口、或任何街道的末尾任意轉向,包括轉u型彎。鏟雪車鏟雪時前進速度為20 km/h,不剷雪時前進速度為50 km/h。

保證:鏟雪車從起點一定可以到達任何街道。

輸出

鏟掉所有街道上的雪並且返回出發點的最短時間,精確到分種。

樣例輸入 copy

0 00 0 10000 10000

5000 -10000 5000 10000

5000 10000 10000 10000

樣例輸出 copy

3:55

提示

3小時55分鐘

題意:給你乙個無向圖,問經過所有路徑並回到起點的最短路。

思路:這個題只是用到了尤拉迴路的思想,具體**的話直接算就可以。先來理解一下怎麼樣才能使得路徑最短。因為題目中說可以在任意位置任意轉向,要想時間最短,只需要將每條路都走一遍再回到起點即可。

**:

#includeusing namespace std;

typedef long long ll;

double dis(double x1,double y1,double x2,double y2)

void ac()

int main()

騎馬修柵欄

題目描述

農民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行,每行乙個整數,依次表示路徑經過的頂點號。注意資料可能有多組解,但是只有上面題目要求的那一組解是認為正確的。

樣例輸入 copy

91 2

2 33 4

4 24 5

2 55 6

5 74 6

樣例輸出 copy12

3425

4657

題意:給你乙個無向圖,要求從任意一點出發,經過所有邊,在某一點結束,輸出字典序最小的路徑。

思路:這個題要注意的就是dfs過程中列舉出點的順序。因為題目中要求字典序最小,第一反應可能是列舉的時候從大到小列舉,這樣倒序輸出路徑還原時就是字典序最小了。但是!真的是這樣嗎?答案是否定的。可以看一下前面尤拉迴路的定義,這就要求了從乙個點出去遍歷幾個點之後再回到這個點,我們來舉個例子:比如1,3,5.如果我們先列舉1的話,就意味著從1出去的一條路會把3和5串聯起來,這也就保證了1是最後加到答案中的,逆序輸出後,就在前面。所以列舉時就從小到大列舉就好了!

**:

#includeusing namespace std;

const int maxn=1100;

int n=500,m;

int g[maxn][maxn];

int ans[maxn],cnt;

int tot[maxn];

void dfs(int u)

ans[++cnt]=u;

}int main()

int s=1;

while(!tot[s]) s++;

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

if(tot[i]%2)

dfs(s);

for(int i=cnt;i;i--) cout《萬物皆可圖論

不當之處,請多指教~

尤拉路徑 騎馬修柵欄

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

尤拉路徑 USACO 騎馬修柵欄

題意 給出乙個無向圖,求尤拉路徑 不重複地經過所有邊 經過的點的次序。做法 找出尤拉路徑的方法就是採用dfs的方式,找到第乙個入度為奇數的點開始dfs。對於當前的點,從大到小列舉所有點,找到和它相連的,找到乙個之後刪除它們之間的連線,並去搜尋新的那個點,如果沒有找到點和它相連,那麼就把這個點加入輸出...

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

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