1. 程式人生 > >歐拉路小結 JZYZOJ1210 騎馬修柵欄

歐拉路小結 JZYZOJ1210 騎馬修柵欄

++ asp source 鼠標 pan 錯誤 是你 nbsp 其他

現在寫到歐拉路,理解起來並不算特別困難...吧...

但是非常惡心的是每次都要調試半天,做不到一遍兩遍就能ac 每次寫程序都對於程序的整體構架沒有清晰的思路,想到哪裏寫到哪裏真的是個非常差的習慣[盡管在寫不出來的時候非常有用],所以快點改掉吧. 似乎也沒有什麽特別困難的部分,相關的題在oj上是p1209-p1211 數組一定要記得稍微開大一點,不要順手就打一個數據範圍上去,很初級也很常見的錯誤 應該深入理解一下dfs之後記錄的作用,但是我到現在還不理解 以p1210為例
騎馬修柵欄
描述 Description
農民John每年有很多柵欄要修理。他總是騎著馬穿過每一個柵欄並修復它破損的地方。
John是一個與其他農民一樣懶的人。他討厭騎馬,因此從來不兩次經過同一個柵欄。你必須編一個程序,讀入柵欄網絡的描述,並計算出一條修柵欄的路徑,使每個柵欄都恰好被經過一次。John能從任何一個頂點(即兩個柵欄的交點)開始騎馬,在任意一個頂點結束。
每一個柵欄連接兩個頂點,頂點用1到500標號(雖然有的農場並沒有500個頂點)。一個頂點上可連接任意多(>=1)個柵欄。所有柵欄都是連通的(也就是你可以從任意一個柵欄到達另外的所有柵欄)。
你的程序必須輸出騎馬的路徑(用路上依次經過的頂點號碼表示)。我們如果把輸出的路徑看成是一個500進制的數,那麽當存在多組解的情況下,輸出500進制表示法中最小的一個 (也就是輸出第一個數較小的,如果還有多組解,輸出第二個數較小的,等等)。
輸入格式 Input Format
第1行: 一個整數F(1 <= F <= 1024),表示柵欄的數目
第2到F+1行: 每行兩個整數i, j(1 <= i,j <= 500)表示這條柵欄連接i與j號頂點。
輸出格式 Output Format
輸出應當有F+1行,每行一個整數,依次表示路徑經過的頂點號。註意數據可能有多組解,但是只有上面題目要求的那一組解是認為正確的。
樣例輸入 Sample Input
樣例輸出 Sample Output
時間限制 Time Limitation
1s
註釋 Hint
字典序最小的歐拉路
給一個例子:
技術分享
來源 Source
usaco 3.3.1
Flag   Accepted
題號   P1210
類型(?)   圖結構
通過   58人
提交   205次
通過率   28%
難度   1
提交 討論 題解 數據

代碼如下[裏面有非常不必要的東西..但是都這樣了也懶得改回去了] 技術分享
 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cstring>
 4 #include<algorithm>
 5 using namespace std;
 6 int maxn=0;
 7 int tail=0;
 8 int flag=0;
 9 int f,ss;
10 int sta[510]={};
11 int sum[510]={};
12 int woc[510][510]={};
13 int mos[510][510]={};
14 int cun[510]={};
15 void mydfs(int x,int k){
16     for(int i=1;i<=mos[x][0];i++){
17         int w=mos[x][i];
18         if(woc[x][w]!=0){
19             woc[x][w]-=1;
20             woc[w][x]-=1;
21             mydfs(w,k+1);
22             cun[ss--]=w;//這個--肥腸重要,嗯我也不會解釋,復習的時候看著理解好了
23                     if(ss==1){
24                 for(int i=2;i<=f+1;i++){
25                     cout<<cun[i]<<endl;
26                 }
27             }
28         }
29     }
30 }
31 int main(){
32     cin>>f;
33     ss=f+1;
34     for(int i=1;i<=f;i++){
35         int x,y;
36         cin>>x>>y;
37         if(x>maxn){
38             maxn=x;
39         }
40         if(y>maxn){
41             maxn=y;
42         }
43         sum[x]++;
44         sum[y]++;
45         mos[y][++mos[y][0]]=x;
46         mos[x][++mos[x][0]]=y;
47         woc[x][y]+=1;
48         woc[y][x]+=1;
49     }
50     for(int i=1;i<=maxn;i++){
51         if(mos[i][0]!=0){
52             sort((int*)mos+510*i+1,(int*)mos+510*i+mos[i][0]+1);
53         }
54     }
55     int f1=0;
56     for(int i=1;i<=500;i++){
57         if(sum[i]%2==1){
58             f1=i;
59             break;
60         }
61     }
62     if(f1!=0){
63         cout<<f1<<endl;
64         mydfs(f1,0);
65     }
66     else{
67         cout<<1<<endl;
68         mydfs(1,0);
69     }
70     return 0;
71 }
View Code

歐拉路小結 JZYZOJ1210 騎馬修柵欄