异灵术老师镇楼!!!
题目描述
今有一张无向图,求它的欧拉回路。
Solution
dfs 就是干
#include<cstdio>
#include<cstdlib>
#include<cstring>
int m;
int a[510][510];
int dg[510];
int maxn=-1;
int stack[10010];
int sx,sy;
int st;
int max(int x,int y){
if(x>y) return x;
return y;
}
void dfs(int x,int h){
if(h==m+1){
for(int i=1;i<=h;++i)
printf("%d\n",stack[i]);
exit(0);
}
for(int i=1;i<=maxn;++i){
if(a[i][x]){
--a[i][x];--a[x][i];
stack[h+1]=i;
dfs(i,h+1);
++a[i][x];++a[x][i];
}
}
}
int main(){
memset(a,0,sizeof(a));
memset(dg,0,sizeof(dg));
scanf("%d",&m);
for(int i=1;i<=m;++i){
scanf("%d%d",&sx,&sy);
++a[sx][sy];++a[sy][sx];
++dg[sx];++dg[sy];
maxn=max(maxn,max(sx,sy));
}
st=1;
for(int i=1;i<=maxn;++i)
if(dg[i]%2){
st=i;
break;
}
stack[1]=st;
dfs(st,1);
}
这样很明显会 T 掉。
每当我们回到起点,但是没有遍历完所有边,并且无法扩展的时候,当前走的这条边一定是最终答案的一部分。将他压入栈中,最后倒序输出即可。
#include<cstdio>
#include<cstdlib>
#include<cstring>
int m;
int a[510][510];
int dg[510];
int maxn=-1;
int stack[10010];
int sx,sy;
int st:
int top=0;
int max(int x,int y){
if(x>y) return x;
return y;
}
void dfs(int x){
for(int i=1;i<=maxn;++i){
if(a[i][x]){
--a[i][x];--a[x][i];
dfs(i);
}
}
stack[++top]=x;
}
int main(){
freopen("yh.txt","w",stdout);
memset(a,0,sizeof(a));
memset(dg,0,sizeof(dg));
scanf("%d",&m);
for(int i=1;i<=m;++i){
scanf("%d%d",&sx,&sy);
++a[sx][sy];++a[sy][sx];
++dg[sx];++dg[sy];
maxn=max(maxn,max(sx,sy));
}
st=1;
for(int i=1;i<=maxn;++i)
if(dg[i]%2){
st=i;
break;
}
dfs(st);
for(int i=top;i>=1;--i)
printf("%d\n",stack[i]);
}