import java.io.BufferedOutputStream;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.util.ArrayList;
import java.util.Stack;
import java.util.StringTokenizer;
import java.util.TreeSet;
public class kon {
public static void main(String[] args) throws IOException {
BufferedReader bi = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer tokenizer = new StringTokenizer(bi.readLine());
int liczbaSkrzyzowan = Integer.parseInt(tokenizer.nextToken());
int liczbaDrog = Integer.parseInt(tokenizer.nextToken());
Graf graf = new Graf(liczbaSkrzyzowan);
for (int i = 0; i< liczbaDrog; i++){
tokenizer = new StringTokenizer(bi.readLine());
int miastoA = Integer.parseInt(tokenizer.nextToken());
int miastoB = Integer.parseInt(tokenizer.nextToken());
graf.addScizke(miastoA-1, miastoB-1);
}
PrintWriter drukuj = new PrintWriter(new BufferedOutputStream(System.out));
graf.piszCykle(drukuj);
drukuj.flush();
}
}
class Graf{
ArrayList<ArrayList<Integer>> sciezka;
boolean odwiedziny [];
Stack<Integer> S;
Graf(int liczbaMiast){
odwiedziny = new boolean [liczbaMiast];
sciezka = new ArrayList<>();
for (int i = 0; i<liczbaMiast; i++){
sciezka.add(new ArrayList<Integer>());
}
}
void addScizke(int a, int b){
sciezka.get(a).add(b);
}
boolean DFSfindCycle(int v, int w){
odwiedziny[w] = true;
S.push(w);
for (int i = 0; i<sciezka.get(w).size(); i++){
int u = sciezka.get(w).get(i);
if (u == S.peek())
continue;
if (u==v)
return true;
if (odwiedziny[u] == false && DFSfindCycle(v, u) == true)
return true;
}
S.pop();
return false;
}
void piszCykle(PrintWriter drukuj){
TreeSet<Integer> coJestZawsze = new TreeSet<>();
TreeSet<Integer> mozliwe;
S = new Stack<>();
for (int i = 0; i<sciezka.size(); i++){
for (int j = 0; j<sciezka.size(); j++)
odwiedziny[j] = false;
if (DFSfindCycle(i, i)){
Stack<Integer> T = new Stack<>();
T.push(i);
while(!S.isEmpty())
T.push(S.pop());
mozliwe = new TreeSet<>();
while(!T.isEmpty()){
Integer zdjete = T.pop();
if (i == 0)
mozliwe.add(zdjete);
else{
if (coJestZawsze.contains(zdjete))
mozliwe.add(zdjete);
}
}
coJestZawsze = mozliwe;
}
if (i == 0 && coJestZawsze.size() == 0){
drukuj.println("NIE");
return;
}
}
drukuj.println(coJestZawsze.size());
for (int skrzyzowanie : coJestZawsze){
if (skrzyzowanie == coJestZawsze.last())
drukuj.print(skrzyzowanie + 1);
else
drukuj.print((skrzyzowanie+1)+" ");
}
}
void print(){
for (int i = 0; i<sciezka.size(); i++){
System.out.print(i+ " | ");
for (int j = 0; j<sciezka.get(i).size(); j++)
System.out.print(sciezka.get(i).get(j)+ " ");
System.out.println();
}
}
}
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 | import java.io.BufferedOutputStream; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.io.PrintWriter; import java.util.ArrayList; import java.util.Stack; import java.util.StringTokenizer; import java.util.TreeSet; public class kon { public static void main(String[] args) throws IOException { BufferedReader bi = new BufferedReader(new InputStreamReader(System.in)); StringTokenizer tokenizer = new StringTokenizer(bi.readLine()); int liczbaSkrzyzowan = Integer.parseInt(tokenizer.nextToken()); int liczbaDrog = Integer.parseInt(tokenizer.nextToken()); Graf graf = new Graf(liczbaSkrzyzowan); for (int i = 0; i< liczbaDrog; i++){ tokenizer = new StringTokenizer(bi.readLine()); int miastoA = Integer.parseInt(tokenizer.nextToken()); int miastoB = Integer.parseInt(tokenizer.nextToken()); graf.addScizke(miastoA-1, miastoB-1); } PrintWriter drukuj = new PrintWriter(new BufferedOutputStream(System.out)); graf.piszCykle(drukuj); drukuj.flush(); } } class Graf{ ArrayList<ArrayList<Integer>> sciezka; boolean odwiedziny []; Stack<Integer> S; Graf(int liczbaMiast){ odwiedziny = new boolean [liczbaMiast]; sciezka = new ArrayList<>(); for (int i = 0; i<liczbaMiast; i++){ sciezka.add(new ArrayList<Integer>()); } } void addScizke(int a, int b){ sciezka.get(a).add(b); } boolean DFSfindCycle(int v, int w){ odwiedziny[w] = true; S.push(w); for (int i = 0; i<sciezka.get(w).size(); i++){ int u = sciezka.get(w).get(i); if (u == S.peek()) continue; if (u==v) return true; if (odwiedziny[u] == false && DFSfindCycle(v, u) == true) return true; } S.pop(); return false; } void piszCykle(PrintWriter drukuj){ TreeSet<Integer> coJestZawsze = new TreeSet<>(); TreeSet<Integer> mozliwe; S = new Stack<>(); for (int i = 0; i<sciezka.size(); i++){ for (int j = 0; j<sciezka.size(); j++) odwiedziny[j] = false; if (DFSfindCycle(i, i)){ Stack<Integer> T = new Stack<>(); T.push(i); while(!S.isEmpty()) T.push(S.pop()); mozliwe = new TreeSet<>(); while(!T.isEmpty()){ Integer zdjete = T.pop(); if (i == 0) mozliwe.add(zdjete); else{ if (coJestZawsze.contains(zdjete)) mozliwe.add(zdjete); } } coJestZawsze = mozliwe; } if (i == 0 && coJestZawsze.size() == 0){ drukuj.println("NIE"); return; } } drukuj.println(coJestZawsze.size()); for (int skrzyzowanie : coJestZawsze){ if (skrzyzowanie == coJestZawsze.last()) drukuj.print(skrzyzowanie + 1); else drukuj.print((skrzyzowanie+1)+" "); } } void print(){ for (int i = 0; i<sciezka.size(); i++){ System.out.print(i+ " | "); for (int j = 0; j<sciezka.get(i).size(); j++) System.out.print(sciezka.get(i).get(j)+ " "); System.out.println(); } } } |
English