足足想了我两天,向比赛中做出的大神致敬。。。
思路:先求出所有的二元组(i,j),使得该二元组满足题意。
这个可以通过建立反向边求得(bfs)
然后对于二元组(i,j),(j,k),若都不满足题意,则集合(i,j,k),(i,k)一定不满足题意(反证:假设(i,k)满足题意,则存在str使得i->x,k->null(或者反过来),
而j在这个str下不是null就是某个非null,那么对于这个str(i,j),(j,k)必有一个满足题意,不可能)
所以可以使用并查集求不可能的方法数。那么可能的方法数就好求了。
#include <fstream>
#include <stdio.h>
#include <string.h>
#include <iostream>
#include <algorithm>
#include <vector>
#include <queue>
#include <set>
#include <