當前位置:
首頁 >
Riding the Fences USACO 3.3 欧拉路径(dfs+floodfill)
發布時間:2025/6/17
21
豆豆
生活随笔
收集整理的這篇文章主要介紹了
Riding the Fences USACO 3.3 欧拉路径(dfs+floodfill)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
額,我是直接dfs的思路,但是到case 5過不去了,感覺是太慢了。然后網上看題解,題目原型就是歐拉路徑,
歐拉路徑存在的條件是 要么點的度都是偶數,要么只有兩個點的度是奇數。如果是兩個點的度是奇數,起點和終點一定是這兩個點,
然后我就加了一個判斷,如果是有奇數度的點,取較小的點作為起點dfs。
dfs寫的很丑,沒組織好,還根據初始點判斷,其實組織好沒有這么麻煩...
但是到7還是過不去,繼續看題解,發現有個大牛dfs同時加了個floodfill
其實我一直以為floodfill就是dfs和bfs...
然后我仿照加了個勉強過了
?
1 /* 2 3 ID: hubiao cave 4 5 PROG: fence 6 7 LANG: C++ 8 9 */ 10 11 12 13 14 #include<iostream> 15 16 #include<fstream> 17 #include<cstring> 18 #include<vector> 19 #include<deque> 20 #include<algorithm> 21 22 using namespace std; 23 24 25 26 vector<int> g_vertex_maps[501]; 27 deque<int> g_vertex_sequence; 28 int g_visit[501][501]; 29 int g_fence_number; 30 int g_max_vertex,g_min_vertex=1; 31 int g_count; 32 int node_counter[501]; 33 bool g_isover=false; 34 int special_start_vertex=8888; 35 36 void dfs(int); 37 bool floodfill(long node); 38 ofstream fout("fence.out"); 39 int main() 40 41 { 42 43 ifstream fin("fence.in"); 44 45 //ofstream fout("fence.out"); 46 47 fin>>g_fence_number; 48 49 int a,b; 50 for(int i=0;i<g_fence_number;i++) 51 { 52 fin>>a>>b; 53 if(i==0) 54 g_min_vertex=min(a,b); 55 56 g_vertex_maps[a].push_back(b); 57 g_vertex_maps[b].push_back(a); 58 59 node_counter[a]++; 60 node_counter[b]++; 61 g_visit[a][b]++; 62 g_visit[b][a]++; 63 64 g_max_vertex=g_max_vertex>max(a,b)?g_max_vertex:max(a,b); 65 g_min_vertex=g_min_vertex<min(a,b)?g_min_vertex:min(a,b); 66 67 } 68 69 for(int i=g_min_vertex;i<=g_max_vertex;i++) 70 { 71 if(!g_vertex_maps[i].empty()) 72 sort(g_vertex_maps[i].begin(),g_vertex_maps[i].end()); 73 74 if(g_vertex_maps[i].size()%2==1)//歐拉路徑 找度為奇數的點為起點加速 75 special_start_vertex=min(special_start_vertex,i); 76 77 } 78 79 80 if(special_start_vertex==8888) 81 dfs(0); 82 else 83 dfs(special_start_vertex); 84 85 86 return 0; 87 88 89 } 90 91 void dfs(int start_vertex) 92 { 93 94 if(g_count==g_fence_number) 95 { 96 if(special_start_vertex!=8888) 97 g_vertex_sequence.push_front(special_start_vertex); 98 for(int i=0;i<g_vertex_sequence.size();i++) 99 fout<<g_vertex_sequence[i]<<endl; 100 g_isover=true; 101 exit(0); 102 //return; 103 } 104 105 if(start_vertex!=0&&!floodfill(start_vertex)) 106 { 107 return; 108 } 109 110 if(start_vertex==0) 111 { 112 for(int i=g_min_vertex;i<=g_max_vertex;i++) 113 { 114 115 for(int j=0;j<g_vertex_maps[i].size();j++) 116 { 117 g_count++; 118 g_visit[i][g_vertex_maps[i][j]]--; 119 g_visit[g_vertex_maps[i][j]][i]--; 120 g_vertex_sequence.push_back(i); 121 g_vertex_sequence.push_back(g_vertex_maps[i][j]); 122 node_counter[i]--; 123 node_counter[g_vertex_maps[i][j]]--; 124 125 dfs(g_vertex_maps[i][j]); 126 127 if(g_isover) 128 return; 129 130 node_counter[i]++; 131 node_counter[g_vertex_maps[i][j]]++; 132 133 g_vertex_sequence.pop_back(); 134 g_vertex_sequence.pop_back(); 135 g_visit[i][g_vertex_maps[i][j]]++; 136 g_visit[g_vertex_maps[i][j]][i]++; 137 138 g_count--; 139 } 140 } 141 } 142 else 143 { 144 for(int i=0;i<g_vertex_maps[start_vertex].size();i++) 145 { 146 int end_vertex=g_vertex_maps[start_vertex][i]; 147 if(g_visit[start_vertex][end_vertex]>0) 148 { 149 g_count++; 150 g_visit[start_vertex][end_vertex]--; 151 g_visit[end_vertex][start_vertex]--; 152 g_vertex_sequence.push_back(end_vertex); 153 154 node_counter[start_vertex]--; 155 node_counter[end_vertex]--; 156 157 dfs(end_vertex); 158 if(g_isover) 159 return; 160 161 node_counter[start_vertex]++; 162 node_counter[end_vertex]++; 163 164 g_count--; 165 g_visit[start_vertex][end_vertex]++; 166 g_visit[end_vertex][start_vertex]++; 167 g_vertex_sequence.pop_back(); 168 } 169 170 } 171 } 172 } 173 174 bool floodfill(long node) 175 { 176 int *stack=new int[501],top=-1; 177 bool vis[501]; 178 //for(int i=0;i<=500;i++) 179 memset(vis,0,sizeof(vis)); 180 181 stack[++top]=node; 182 vis[node]=true; 183 while(top>-1) 184 { 185 int m=stack[top--]; 186 for(int i=g_min_vertex;i<=g_max_vertex;i++) 187 { 188 if(g_visit[m][i]&&!vis[i]) 189 { 190 stack[++top]=i; 191 vis[i]=true; 192 } 193 } 194 } 195 196 for(int i=g_min_vertex;i<=g_max_vertex;i++) 197 { 198 if(!vis[i]&&node_counter[i]) 199 { 200 delete stack; 201 return false; 202 } 203 } 204 delete stack; 205 return true; 206 207 }?
轉載于:https://www.cnblogs.com/cavehubiao/p/3363120.html
《新程序員》:云原生和全面數字化實踐50位技術專家共同創作,文字、視頻、音頻交互閱讀總結
以上是生活随笔為你收集整理的Riding the Fences USACO 3.3 欧拉路径(dfs+floodfill)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: AAuto 快速开发win32小程序
- 下一篇: nyoj 776 删除元素