#include #include #include #include #include #include #include #include #include using namespace std; typedef long long int llint; #define mp make_pair #define mt make_tuple #define pub push_back #define puf push_front #define pob pop_back #define pof pop_front #define fir first #define sec second #define res resize #define ins insert #define era erase const int mod=1000000007; const int big=1e9+1e8; const llint red=0xE869120; const llint pro=1002001; const long double pai=3.141592653589793238462643383279; //JOI Building 2 template void mineq(T& a,U b){if(a>b){a=b;}} template void maxeq(T& a,U b){if(a>road; vector>rroad; vectorban;//帰りがけ順の場所 vectorsir;//調べたらtrue vectoruni;//同じ連結成分かどうか,トポロジカル順序になっている int n,num,kyonum; SCC(void){} SCC(int in){n=in;road.res(n);rroad.res(n);} inline void add_road(int a,int b){road[a].pub(b);rroad[b].pub(a);} void dfs_scc(int town){ if(sir[town]){return;} sir[town]=true;//cout<<"de "<>Croad; vector>Crroad; void chain_scc(void){ //uni番目の街に対応させる //uniは1-beginに注意 int i,j; Croad.res(kyonum); Crroad.res(kyonum); for(i=0;i> do_sat(void){ logic.do_scc(); vectorans(n); for(int i=0;ilogic.uni[Not(i)]; } return mp(true,ans); } }; int main(void){ int n,m,i,j,q,w;cin>>n>>m; SAT_2 sat(n); vector>brk(n); pair> mpans; for(i=0;i>q>>w; brk[i]=mp(q,w); } for(i=0;i