警示后人,如果你 TLE on #36
查看原帖
警示后人,如果你 TLE on #36
530180
KingPowers楼主2023/8/10 14:33

如果你是通过欧拉回路来构造,并且你输出方案的 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)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);		
	}
}
2023/8/10 14:33
加载中...