题目链接:https://codeforces.com/problemset/problem/1142/E
*3500
基本上复读其他题解?因为不知道怎么想到的。
首先考虑只有绿的边的情况。
竞赛图有一些很好的性质link。
根据上面链接中的定理1,我们考虑将最终的竞赛图强连通缩点。由于拓扑序小的点对于每一个拓扑序大的点都有连边,我们考虑一种做法:维护一个当前可能成为最后答案的集合 \(S\)。每次从 \(S\) 中取出两点,询问他们的边的指向,将被指向的点删除。
考虑这种做法的正确性。首先最后 \(S\) 中剩下的那一个点一定是拓扑序最小的强连通分量中的一点。这可以由定理1得到。比方说,对于每一条边 \(u \to v\),如果 \(u\) 和 \(v\) 是属于同一个强连通分量,那么显然这么取可以让 \(u\) 和 \(v\) 联通。这样取下去每一个连通块内都会被缩成强连通分量。我们可以任意保留 \(u\) 或者 \(v\),于是这部分就是对的。如果 \(u\) 和 \(v\) 不属于同一个强连通分量,那么有拓扑序小的强连通块连向拓扑序大的连通块。所以我们保留 \(u\) 就是一定对的。
接下来考虑粉色边的情况。这种情况下,如果我们再钦定答案为全集,这时候我们不能询问粉色的边,就会出现问题。从特殊情况入手,假设粉色边构成了一张有向无环图,那么非常好办,我们可以臆想我们从所有入度为零的点开始按照拓扑序的顺序进行了若干次询问,然后所有粉色边就没了。剩下的情况就是有粉色边构成了若干强连通分量。这时候考虑缩点,把所有强连通分量缩成一个点。考虑什么情况下才会询问到粉色的边,发现其实你只需要保证在同一个强连通分量内的点不同时出现在 \(S\) 中即可。所以我们选一个点代表一个联通块,当一个强连通分量中的那个点被删去后,我们再把其中任意一个其它的点放入 \(S\) 中即可。
这样子做由于每次都会删掉一个点,所以最多 \(n - 1\) 次询问。
实现上不用很麻烦,其实只需要删去一些能让粉色边构成环的粉边即可。
感谢 @gdf_yhm 教我做题。
最后,请容许我在这里致敬一下伟大的摇滚乐队 Pink Floyd。啥都不说了 ,平克·佛洛依德牛皮!