因为时间有限,算法竞赛,会用就好,后面再补充正确性证明
问题解决类型:
求解一些bool型0/1变量,要满足一些形如\(x_i=a\)则\(x_j=b\)的关系。
流程
每个变量拆点为,\(x_0\)和\(x_1\),分别表示值取\(0/1\)。
强联通分量缩点,每个分量里面的变量值相同。如果\(x_0\)和\(x_1\)在同一个强连通分量内,无解。
如果\(x_0\)能最终到达\(x_1\),所以最终\(x=1\),因为如果\(x=0\)两个都满足,矛盾。
所以选择节点拓扑序大的值即可。
发现跑Tarjan,得到强连通分量编号越小的拓扑序越大。
所以选择编号小的即可。