T1是欧拉路板子,但我不会,直接爆炸。。
这玩意就是个dfs,但我以前一直以为欧拉路只能$O(nm)$求
今天才知道可以$O(n+m)$
欧拉路判定:
无向:起点终点为奇度点,其余偶度
有向:起点终点出度入度分别差一,其余相等。
欧拉回路类似。
怎么求??
我们可以很容易找到起点。然后由于其他点的度数为偶数,就可以保证进去就一定可以出来。
所以瞎搜就完事,注意到有环套环的情况,我们先把这个点扩展完再把该点入栈。
代码实现很简单:
void dfs(int x) { for(int i=head[x];i;i=nxt[i]) if(!v[id[i]]) { v[id[i]]=1; dfs1(to[i]); s[++top]=id[i]; } return ; }
一点优化:
当前弧优化,注意到有些毒瘤出题人卡这种做法。
因为一个点不止拓展一次,那么复杂度就没有保证了,最简单的数据就是两个点直接连着m条边。
所以有大佬发明了这样一个优化:
一条边被访问过就没用了,所以我们可以直接把表头设为第一个合法的,也就是去除无用状态。
代码:
void dfs(int x) { int i=head[x]; while(i) { while(i&&v[id[i]]!=0) i=nxt[i]; head[x]=i; if(i) { v[id[i]]=1; dfs(to[i]); s[++top]=id[i]; i=head[x]; } } return ; }