Cod sursa(job #2167819)

Utilizator SlevySlevoaca Stefan-Gabriel Slevy Data 13 martie 2018 23:47:34
Problema BFS - Parcurgere in latime Scor 70
Compilator java Status done
Runda Arhiva educationala Marime 2.63 kb
import java.util.Scanner;
import java.io.*;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.BitSet;
import java.util.Queue;
import java.util.ArrayDeque;

public class Main {
	
	private static final String INPUT_FILE_PATH = "bfs.in";
	private static final String OUTPUT_FILE_PATH  = "bfs.out";
	
	static class Graph {
		
		private int vertexNr = 0;
		private List<List<Integer>> G;
		
		public Graph(int vertexNr) {
			
			this.vertexNr = vertexNr;
			this.G = new ArrayList<>();
			
			for (int i = 0; i <= this.vertexNr; i++)
				this.G.add(new ArrayList<Integer>());
		}
		
		public void addEdge(int from, int to) {
			
			this.G.get(from).add(to);
		}
		
		public int[] shortestDist(int startVertex) {
			
			int[] dist = new int[vertexNr + 1];
			Arrays.fill(dist, -1);
			
			BitSet mark = new BitSet(vertexNr + 1);
			Queue<Integer> q = new ArrayDeque<Integer>();
			
			/** **/
			q.add(startVertex);
			mark.set(startVertex);
			dist[startVertex] = 0;
			
			while (!q.isEmpty()) {
				
				int currVertex = q.poll();
				
				for (int i = 0; i < G.get(currVertex).size(); i++) {
					
					int vertex = G.get(currVertex).get(i);
					if (!mark.get(vertex)) {
						
						q.add(vertex);
						mark.set(vertex);
						dist[vertex] = dist[currVertex] + 1;
					}
				}
			}
			
			return dist;
		}
		
		public void printGraph() {
			
			if (G == null)
				throw new NullPointerException();
			
			for (int i = 1; i <= vertexNr; i++) {
				
				System.out.print(i + ": ");
				
				for (int j = 0; j < G.get(i).size(); j++)
					System.out.print(G.get(i).get(j) + " ");
				
				System.out.print("\n");
			}
		}
	}
	
	private static Graph g = null;
	private static int vertexNr, startVertex;
	
	public static void read() {
		
		try (Scanner in = new Scanner(new BufferedReader(new FileReader(INPUT_FILE_PATH)))) {
			
			int edgeNr, x, y;
			vertexNr = in.nextInt();
			g = new Graph(vertexNr);
		
			edgeNr = in.nextInt();
			startVertex = in.nextInt();
			
			for (int i = 1; i <= edgeNr; i++) {
				
				x = in.nextInt();
				y = in.nextInt();
				
				g.addEdge(x, y);
			}
			
		} catch (Exception ex) {
			
			ex.printStackTrace();
		}
	}
	
	public static void main(String[] args) {
		
		read();
		
		int[] sol = g.shortestDist(startVertex);
		
		try (PrintWriter out = new PrintWriter(new BufferedWriter(new FileWriter(OUTPUT_FILE_PATH)))) {
			
			for (int i = 1; i <= vertexNr; i++)
				out.print(sol[i] + " ");
			out.print("\n");
			
		} catch (IOException ex) {
			
			ex.printStackTrace();
		}
	}
}