Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- import java.io.*;
- import java.util.*;
- public class Main{
- static int N, E;
- static ArrayList< LinkedList<Integer> > gr = new ArrayList<>();
- static ArrayList< LinkedList<Integer> > REgr = new ArrayList<>();
- static boolean[] visit;
- static Stack<Integer> st = new Stack<>();
- static int[][] comp;
- static int curComp = 0;
- static int numNodes = 0;
- public static void dfs1(int u){
- visit[u] = true;
- LinkedList<Integer> kids = gr.get(u);
- for( int kid : kids){
- if( !visit[kid] ){
- visit[kid] = true;
- dfs1(kid);
- }
- }
- st.add(u);
- }
- public static void dfs2(int u){
- visit[u] = true;
- comp[u][0] = curComp;
- comp[u][1] = numNodes;
- numNodes++;
- LinkedList<Integer> kids = REgr.get(u);
- for( int kid : kids){
- if( !visit[kid] ){
- visit[kid] = true;
- dfs2(kid);
- }
- }
- }
- public static void main(String[] args) throws Exception{
- BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
- String[] re = br.readLine().split(" ");
- N = Integer.parseInt(re[0]);
- E = Integer.parseInt(re[1]);
- visit = new boolean[N+1];
- comp = new int[N+1][2];
- for(int k=0; k<=N; k++){
- gr.add(k, new LinkedList<Integer>() );
- REgr.add(k, new LinkedList<Integer>() );
- visit[k] = false;
- }
- for(int k=0; k<E; k++){
- re = br.readLine().split(" ");
- int x = Integer.parseInt(re[0]);
- int y = Integer.parseInt(re[1]);
- gr.get(x).add(y);
- REgr.get(y).add(x);
- } //finish the graph.
- br.close();
- //run the first time dfs
- for(int k = 1; k<=N; k++){
- if(!visit[k] ){ dfs1(k);}
- }
- Arrays.fill(visit, false);
- curComp = 0;
- numNodes = 1;
- while( !st.isEmpty() ){
- int u = st.pop();
- if( !visit[u] ){
- dfs2(u);
- comp[u][1] = numNodes-1;
- curComp++;
- numNodes = 1;
- }
- }
- for(int k=1; k<=N; k++){
- if( comp[k][1] > 1 ){ System.out.print( 1 + " ");}
- else{ System.out.print(0 + " "); }
- }
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement