#include #include #include using namespace std; int main() { // 入力を受け取る int N, M; cin >> N >> M; vector> G(N); // グラフを表現する隣接リスト (終点のインデックスから、始点の番号を取り出す) vector deg(N, 0); // deg[v]:頂点 v の出次数 // for(int i = 0; i < M; ++i) { // int a, b; cin >> a >> b; // // 通常のグラフとは逆で、G[b] に a を入れる // G[b].push_back(a); // // 頂点 a の出次数を 1 増やす // deg[a]++; // } for(int i = 0;i < M; ++i){ int a,b; cin >> a >> b; a--; b--; G[b].push_back(a); deg[a]++; bool f = false; vector deg_copy = deg; queue que; // 探索候補の頂点番号を入れるキュー // 頂点 v = 0, 1, …, N-1 の順に for(int v = 0; v < N; ++v) { // 頂点 v の出次数が最初の時点で 0 ならば、キューに v を入れる if(deg_copy[v] == 0) {que.push(v);} } vector order; // トポロジカルソート順を格納するための配列 // キューに要素が残っている限り while(que.size() > 0) { // キューの先頭要素 v を取り出し、配列 order に挿入する int v = que.front(); que.pop(); order.push_back(v); // 頂点 v に隣接している頂点 v2 について、 for(auto v2 : G[v]) { // v2 の出次数を 1 減らして、もし出次数が 0 になったらキューに v2 を入れる deg_copy[v2]--; if(deg_copy[v2] == 0) {que.push(v2);} } } // 全ての頂点が order に含まれているかによって、答えを変える if(order.size() != N) { // order の要素数が N でなければ、order に含まれていない頂点があるので Yes f = false; G[b].pop_back(); G[a].push_back(b); deg[a]--; deg[b]++; cout << 1 << endl; } else { // order の要素数が N であれば、すべての頂点が order に含まれているので No f = true; cout << 0 << endl; } } return 0; }