Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- package main;
- import java.util.ArrayList;
- import java.util.HashSet;
- import java.util.List;
- import java.util.Scanner;
- import java.util.Set;
- import java.util.Stack;
- public class GraphBase {
- private static class Vertex {
- public int time, comp, low, n;
- public List<Vertex> lst;
- public Vertex(int count, int n_) {
- lst = new ArrayList<>(count);
- n = n_;
- }
- }
- private static int count = 1, time = 1;
- private static List<Set<Vertex>> stv;
- private static void tarjan(List<Vertex> g) {
- Stack<Vertex> s = new Stack<Vertex>();
- for (Vertex i : g)
- if (i.time == 0)
- visitVertexTarjan(g, i, s);
- }
- private static void visitVertexTarjan(List<Vertex> g, Vertex v,
- Stack<Vertex> s) {
- v.time = v.low = time++;
- s.push(v);
- for (Vertex i : v.lst) {
- if (i.time == 0)
- visitVertexTarjan(g, i, s);
- if (i.comp == 0 && v.low > i.low)
- v.low = i.low;
- }
- if (v.time == v.low) {
- Vertex u;
- stv.add(new HashSet<Vertex>());
- do {
- u = s.pop();
- u.comp = count;
- stv.get(count - 1).add(u);
- } while (u != v);
- count++;
- }
- }
- public static void main(String[] args) {
- Scanner in = new Scanner(System.in);
- int n, m;
- n = in.nextInt();
- m = in.nextInt();
- List<Vertex> g = new ArrayList<>(n);
- stv = new ArrayList<Set<Vertex>>();
- for (int i = 0; i < n; i++)
- g.add(new Vertex(50, i));
- for (int i = 0; i < m; i++) {
- int a, b;
- a = in.nextInt();
- b = in.nextInt();
- g.get(a).lst.add(g.get(b));
- }
- tarjan(g);
- List<Vertex> cg = new ArrayList<>(stv.size());
- for (int i = 0; i < stv.size(); i++)
- cg.add(new Vertex(stv.size(), i));
- for (Set<Vertex> i : stv) {
- for (Vertex v : i) {
- for (Vertex u : v.lst) {
- if (v.comp != u.comp) {
- if (cg.get(v.comp - 1).lst.indexOf(cg.get(u.comp - 1)) == -1) {
- cg.get(v.comp - 1).lst.add(cg.get(u.comp - 1));
- cg.get(u.comp - 1).time++;
- }
- }
- }
- }
- }
- for(Vertex v : cg)
- if(v.time == 0) {
- int min = n + 1;
- for(Vertex u : stv.get(v.n))
- if(u.n < min)
- min = u.n;
- System.out.print(min + " ");
- }
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement