Cod sursa(job #1357025)

Utilizator vlad.maneaVlad Manea vlad.manea Data 23 februarie 2015 18:30:27
Problema BFS - Parcurgere in latime Scor 60
Compilator java Status done
Runda Arhiva educationala Marime 2.3 kb
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;
import java.util.Queue;
import java.util.Scanner;

class Graph {
	private List<List<Integer>> adj;
	
	Graph(List<List<Integer>> adj) {
		this.adj = adj;
	}
	
	List<Integer> computeDistances(int source) {
		List<Integer> distances = new ArrayList<Integer>(this.adj.size());
		
		for (int i = 0; i < this.adj.size(); ++i) {
			distances.add(Integer.MAX_VALUE);
		}
		
		Queue<Integer> queue = new LinkedList<Integer>();
		queue.add(source);
		distances.set(source, 0);
		
		while (!queue.isEmpty()) {
			int node = queue.poll();
			int nodeDistance = distances.get(node);
			
			for (int i = 0; i < adj.get(node).size(); ++i) {
				int sibling = adj.get(node).get(i);
				int siblingDistance = distances.get(sibling);
				
				if (1 + nodeDistance < siblingDistance) {
					distances.set(sibling, 1 + nodeDistance);
					queue.add(sibling);
				}
			}
		}
		
		for (int i = 0; i < this.adj.size(); ++i) {
			if (distances.get(i) == Integer.MAX_VALUE) {
				distances.set(i, -1);
			}
		}
		
		return distances;
	}
}

public class Main {
	public static void main(String args[]) throws IOException {
		InputStream inputStream = new FileInputStream("bfs.in");
		Scanner scanner = new Scanner(inputStream);

		OutputStream outputStream = new FileOutputStream("bfs.out");
		PrintWriter writer = new PrintWriter(outputStream);
		
		int N = scanner.nextInt();
		int M = scanner.nextInt();
		int S = scanner.nextInt();
		
		List<List<Integer>> adj = new ArrayList<List<Integer>>();
		
		for (int i = 0; i < N; ++i) {
			adj.add(new ArrayList<Integer>());
		}
		
		for (int j = 0; j < M; ++j) {
			int x = scanner.nextInt() - 1;
			int y = scanner.nextInt() - 1;			
			adj.get(x).add(y);
		}
		
		Graph graph = new Graph(adj);
		List<Integer> distances = graph.computeDistances(S - 1);
		
		for (Integer distance : distances) {
			writer.write(String.valueOf(distance));
			writer.write(" ");
		}
		
		writer.flush();
		
		scanner.close();
		inputStream.close();

		writer.close();
		outputStream.close();
	}
}