Cod sursa(job #3350714)

Utilizator teofilotopeniTeofil teofilotopeni Data 11 aprilie 2026 21:28:38
Problema BFS - Parcurgere in latime Scor 80
Compilator java Status done
Runda Arhiva educationala Marime 2.48 kb
import java.util.ArrayDeque;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Queue;
import java.util.StringTokenizer;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;

public class Main {

    static ArrayList<ArrayList<Integer>> neighborList;
    static int numarNoduri, targetNode;
    static int[] distances;

    static void ReadData() {
        try {
            BufferedReader br = new BufferedReader(new FileReader("bfs.in"));
            StringTokenizer st = new StringTokenizer(br.readLine());

            numarNoduri = Integer.parseInt(st.nextToken());
            int numarMuchii = Integer.parseInt(st.nextToken());
            targetNode = Integer.parseInt(st.nextToken());

            neighborList = new ArrayList<>(numarNoduri + 1);
            for (int i = 0; i <= numarNoduri; i++) {
                neighborList.add(new ArrayList<>());
            }

            for (int i = 0; i < numarMuchii; i++) {
                st = new StringTokenizer(br.readLine());
                int nod1 = Integer.parseInt(st.nextToken());
                int nod2 = Integer.parseInt(st.nextToken());
                neighborList.get(nod1).add(nod2);
            }
            br.close();
        } catch (IOException e) {
            throw new RuntimeException("Nu pot deschide fisierul bfs.in", e);
        }
    }


    static void BFS() {
        distances = new int[numarNoduri + 1];
        Arrays.fill(distances, -1);

        Queue<Integer> nodQueue = new ArrayDeque<>();
        nodQueue.add(targetNode);
        distances[targetNode] = 0;
        while (!nodQueue.isEmpty()) {
            int actualNode = nodQueue.remove();
            for (int neighbor : neighborList.get(actualNode)) {
                if (distances[neighbor] == -1) {
                    distances[neighbor] = distances[actualNode] + 1;
                    nodQueue.add(neighbor);
                }
            }
        }
    }


    static void WriteData() {
        try {
            BufferedWriter writer = new BufferedWriter(new FileWriter("bfs.out"));
            for (int i = 1; i <= numarNoduri; i++) {
                writer.write(distances[i] + " ");
            }
            writer.close();
        } catch (IOException e) {
            throw new RuntimeException("Nu se poate scrie in fisierul bfs.out", e);
        }
    }

    public static void main(String[] args) {
        ReadData();
        BFS();
        WriteData();
    }
}