引理1:如果\((x,y)\)合法,则\((y,x)\)合法
发现倒着用栈扫一遍还是能够成功匹配
引理2:如果\((x,y)\)合法,\((y,z)\)合法,则\((x,z)\)合法
用栈匹配\((x,y)\)栈会弹空,由于栈是空的,所以匹配\((x,z)\)也会成功。
构造一新图\(G‘\),如果存在\((x,y)\)合法,则\(G‘(x,y)\)之间连有向边。
引理3:\(G‘\)是无向图,而且其每个连通块是一个团。
考虑用启发式合并维护。
维护\(n\)个map和一个并查集,map的下标为\(x\)的元素表示任意一个出边值为\(x\)的元素。
在插入边时,如果map[当前颜色]为空,则把map[当前颜色]赋值为当前点的出边。
否则要合并一下。
考场上这种简单题都没做出来,点分还没调出来,丢人。
原文:https://www.cnblogs.com/ctmlpfs/p/14493433.html