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(); } } } |