Ural 1218 Episode N-th: The Jedi Tournament 题解
题意
给定$n(1\le n\le 20)$个玩家,每个玩家有一个字符串名字和三个整数值(所有玩家的数值都不同)。对于玩家$i$和$j$,如果玩家$i$的三个值中至少有两个值大于玩家$j$的对应值,则$i$玩家可以淘汰$j$玩家。一个玩家胜利了就是他淘汰了所有人。你可以随意安排赛程,输出那些至少胜利了一次的玩家的名字(按照输入的顺序输出)。
题解
构图。若$i$玩家可以淘汰$j$玩家,则从$i$连一条有向边到$j$。问题转化成:如果从$i$开始,能找到一条长度为$n-1$的路径,那么他胜利了。
方法$1$
无脑暴力DFS。边数$n^2$,点数$n$,时间复杂度为$O(n^3)$。妥妥的TLE。
方法$2$
强连通分量缩点。因为在同一个强连通分量中,任意一个点都可以淘汰(这个强连通分量中)其它的点。缩点后,图变成一个DAG,而入度为$0$的那个强连通分量中,任意一个点都可以淘汰(整个图中)其它的点。输出那个强连通分量里所有的点即可。
方法$2$程序
1 | // #pragma GCC optimize(2) |