Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <bits/stdc++.h>
- #ifdef TEST
- #define debug(...) printf(__VA_ARGS__)
- #else
- #define debug(...) (void)0
- #endif
- #define EB emplace_back
- #define MP make_pair
- #define ST first
- #define ND second
- using namespace std;
- using ll = long long;
- using llu = long long unsigned;
- using pii = pair<int,int>;
- /************************/
- #define MXV 100000
- vector<int> grpah[MXV+5];
- int V, E, t = 0;
- int depth[MXV+5], low[MXV+5], instk[MXV+5];
- bool visit[MXV+5], ans[MXV+5];
- stack<int> stk;
- // v => vertex id, d = current depth
- void tarjan(int v){
- stk.emplace(v);
- visit[v] = true;
- instk[v] = true;
- depth[v] = low[v] = ++t;
- for(int ch : grpah[v]){
- if(!visit[ch]){
- tarjan(ch);
- low[v] = min(low[v], low[ch]);
- }
- else if (instk[ch]) low[v] = min(low[v], depth[ch]);
- }
- if(depth[v] == low[v]){
- vector<int> targ;
- int x;
- do{
- instk[x = stk.top()] = false;
- targ.EB(x);
- stk.pop();
- }while(x != v);
- if(targ.size() > 1){
- for(int n : targ){
- ans[n] = true;
- }
- }
- }
- }
- void init(){
- memset(visit, 0x00, sizeof(visit));
- memset(ans, 0x00, sizeof(ans));
- }
- int main(){
- init();
- scanf("%d%d", &V, &E);
- for(int i = 0 ; i < E ; ++i){
- int x, y;
- scanf("%d%d", &x, &y);
- grpah[x].EB(y);
- }
- for(int i = 1 ; i <= V ; ++i){
- if(!visit[i]){
- tarjan(i);
- }
- }
- for(int i = 1 ; i <= V ; ++i){
- printf("%d ", ans[i]);
- }
- //printf("\n");
- return 0;
- }
Add Comment
Please, Sign In to add comment