欧拉路小结 JZYZOJ1210 骑马修栅栏
Posted 鲸头鹳
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了欧拉路小结 JZYZOJ1210 骑马修栅栏相关的知识,希望对你有一定的参考价值。
现在写到欧拉路,理解起来并不算特别困难...吧...
但是非常恶心的是每次都要调试半天,做不到一遍两遍就能ac
每次写程序都对于程序的整体构架没有清晰的思路,想到哪里写到哪里真的是个非常差的习惯[尽管在写不出来的时候非常有用],所以快点改掉吧.
似乎也没有什么特别困难的部分,相关的题在oj上是p1209-p1211
数组一定要记得稍微开大一点,不要顺手就打一个数据范围上去,很初级也很常见的错误
应该深入理解一下dfs之后记录的作用,但是我到现在还不理解
以p1210为例
|
代码如下[里面有非常不必要的东西..但是都这样了也懒得改回去了]
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 }
以上是关于欧拉路小结 JZYZOJ1210 骑马修栅栏的主要内容,如果未能解决你的问题,请参考以下文章
luogu P2731 骑马修栅栏 Riding the Fences | 欧拉道路