如果你是通过欧拉回路来构造,并且你输出方案的 dfs 是类似下面这种写法来实现的:
void dfs(int now){
for(int i=head[now];i;i=e[i].nxt){
if(vis[i]) continue;
vis[i]=vis[i^1]=1;
int to=e[i].to;
dfs(to);
if((++num)&1) printf("%d %d\n",now,to);
else printf("%d %d\n",to,now);
}
}
请注意,这样写的复杂度是错误的,不难发现 #36 的数据是一个菊花,手玩下会发现这么做是 O(nm) 的。
具体的原因则是因为每条边会被重复遍历,解决方法是使用 multiset 存图,把遍历过的边全都删掉。
multiset<int>G[N];
void dfs(int now){
while(G[now].size()){
int to=*G[now].begin();
G[now].erase(G[now].begin());
G[to].erase(G[to].find(now));
dfs(to);
if((++num)&1) printf("%d %d\n",now,to);
else printf("%d %d\n",to,now);
}
}