今天上午的訓練賽涉及到的,順便補一下叭。
相信大家都聽說過著名的七橋問題,而尤拉迴路就是偉大的數學家尤拉為了解決七橋問題提出的。
首先介紹一下基本概念:在乙個圖中,經過每條邊一次並且只經過一次的迴路被稱為尤拉迴路,路徑被稱為尤拉路徑。根據名字就可以知道,迴路是起點終點相同的,而路徑是起點終點不同的。
其實尤拉路徑就是小時候玩的一筆畫遊戲(真是萬物皆可圖論)
特性:起點和終點的度都是奇數,中間點的度數必是偶數
結論:
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標號 雖...