int main(){ scanf("%d%d", &noV, &noE); G = VVI(noV+1, VI(0, 0)); RG = VVI(noV+1, VI(0, 0)); ans = VVI(noV+1, VI(0,0)); vis = VB(noV+1, false); for(int i = 0 ; i < noE ; i++){ int u,v; scanf("%d%d", &u, &v); G[u].push_back(v); RG[v].push_back(u); } for(int i = 1 ; i <= noV ; i++){ if(!vis[i]){ vis[i] = true; dfs(i); st.push(i); } } vis = VB(noV+1, false); vInfoAns = VI(noV+1, -1); while(!st.empty()){ int here = st.top(); st.pop(); if(!vis[here]){ vis[here] = true; ans[noAns].push_back(here); vInfoAns[here] = noAns; dfsReverse(here); noAns++; sort(ans[noAns-1].begin(), ans[noAns-1].end()); } } vis = VB(noAns+1, false); printf("%d\n", noAns); for(int i = 1 ; i <= noV ; i++){ int here = vInfoAns[i]; // == noAns if(!vis[here]){ vis[here] = true; for(auto iter = ans[here].begin() ; iter != ans[here].end() ; iter++){ printf("%d ",*iter); } puts("-1"); } } return 0; }
void Graph::topologicalSort(int src, bool *visit, SI &s){ visit[src] = true; LN::iterator iter = adj[src].begin(); while(iter != adj[src].end()){ if(!visit[(*iter).v]){ topologicalSort((*iter).v, visit, s); } iter++; } s.push(src); }
void dfs(int vertex){ for(auto iter = G[vertex].begin() ; iter != G[vertex].end() ; iter++){ int here = *iter; if(!vis[here]){ vis[here] = true; dfs(here); st.push(here); } } return ; }
int main(int argc, char const *argv[]) { int n, c, s; while(SC2(n, k) && n) { int lt = 0; ZERO(in); ZERO(out); for(int i = 1; i <= n; i++) { SC2(c, s); in[c] = i; out[s] = i; lt = max(lt, s+1); } while(!p.empty()) p.pop(); int i; for(i = 1; i < lt; i++) { if(out[i]){ if(p.empty() || p.top() != out[i]) break; else p.pop(); } if(in[i]){ if((int)p.size() < k) p.push(in[i]); else break; } } printf("%s\n", i == lt ? "Sim" : "Nao"); } }