模板
判欧拉回路
for(int i=1;i<=n;i++){
if(du[i]&1)flag=0;
if(par[i]==i)cnt++;
}
printf("%d\n",flag&&cnt==1);
判欧拉路径
for(int i=1;i<=n;i++){
if(in[i]>out[i]){
if(in[i]-out[i]==1)cnt1++;
else flag=0;
}
if(in[i]<out[i]){
if(out[i]-in[i]==1)cnt2++,st=i;
else flag=0;
}
}
if(flag&&(cnt1+cnt2==0||cnt1==1&&cnt2==1)) {
dfs(st);
bool flag=1;
for(int i=1; i<=n; i++) {
if(!vis[i]) {
flag=0;
break;
}
}
}
求路径(方案)
bool mark[M];
void dfs(int x) {
for(int &i=head[x]; i; i=G[i].nxt) {
if(mark[G[i].id])continue;
mark[G[i].id]=1;
int y=G[i].to,c=G[i].id;
dfs(y);
ans.push_back(c);
}
}
for(int i=ans.size()-1; i>=0; i--)printf("%d ",ans[i]);