code2039 骑马修栏杆
欧拉通路:
find_circuit(结点i){
当结点i有邻居时
选择任意一个邻居j;
删除边(i,j)或者做访问标记;
find_circuit(结点j);
输出或存储节点i;
}
本题注意点的编号可能是不连续的,处理n为最大的点的编号,以后循环1到n即可(尽管1到n不是每一个都有实际意义,但n<500)
本题要求字典序最小,如果你的循环是从1到n的,那要用栈存储,最后一起输出
或者把循环倒过来跑,但是WA,可能是问题没考虑到...
#include<iostream> #include<cstring> #include<algorithm> #include<cstdio> #include<stack> #define Size 505 using namespace std; stack<int> ss; int n,m=0; int g[Size][Size]; int du[Size]; void find(int x){ //cout<<x<<endl; for(int i=1;i<=n;i++){ if(g[x][i]>0){ g[x][i]--; g[i][x]--; find(i); } } ss.push(x); } int main(){ cin>>m; int a,b; for(int i=1;i<=m;i++){ cin>>a>>b; n=max(n,a); n=max(n,b); g[a][b]++;du[a]++; g[b][a]++;du[b]++; } int st=0; for(int i=1;i<=n;i++){ if(du[i]%2){ st=i; break; } } if(st==0){ for(int i=1;i<=n;i++)if(du[i]){ st=i; break; } } find(st); while(!ss.empty()){ printf("%d\n",ss.top()); ss.pop(); } return 0; }