要求字典序的情况的话,爆搜
不要求的话
1:建图,有向边A--->B的意义为选择A则必须选择B,一般一个点的两种取值情况会拆点。
2:缩点。
3:建反向图,跑拓扑排序(有说不用建再跑,但我不懂为什么)。
4:根据实际情况输出。
例题:
代码
#include#include #include #include #include using namespace std;#define ll long longinline ll rd(){ ll x=0,f=1;char c=getchar(); while(!isdigit(c)){ if(c=='-') f=-f;c=getchar();} while(isdigit(c)){x=(x<<1)+(x<<3)+(c^48);c=getchar();} return x*f;}const int N=2e6+13;vector g[N];struct zx{ int nx,to;}e[N<<1];int dfn[N],low[N],top,num,nm,cnt,a[N],v[N],bj[N],du[N],h[N],opp[N];void TJ(int x){ dfn[x]=low[x]=++num;a[++top]=x; for(int i=0,y;i