Pagini recente » Borderou de evaluare (job #473341) | Cod sursa (job #1800288) | Cod sursa (job #1448062) | Borderou de evaluare (job #1567219) | Cod sursa (job #3181803)
import java.io.*;
import java.util.*;
public class Main {
static class Reader {
final private int BUFFER_SIZE = 1 << 16;
private DataInputStream din;
private byte[] buffer;
private int bufferPointer, bytesRead;
public Reader()
{
din = new DataInputStream(System.in);
buffer = new byte[BUFFER_SIZE];
bufferPointer = bytesRead = 0;
}
public Reader(String file_name) throws IOException
{
din = new DataInputStream(
new FileInputStream(file_name));
buffer = new byte[BUFFER_SIZE];
bufferPointer = bytesRead = 0;
}
public String readLine() throws IOException
{
byte[] buf = new byte[64]; // line length
int cnt = 0, c;
while ((c = read()) != -1) {
if (c == '\n') {
if (cnt != 0) {
break;
}
else {
continue;
}
}
buf[cnt++] = (byte)c;
}
return new String(buf, 0, cnt);
}
public int nextInt() throws IOException
{
int ret = 0;
byte c = read();
while (c <= ' ') {
c = read();
}
boolean neg = (c == '-');
if (neg)
c = read();
do {
ret = ret * 10 + c - '0';
} while ((c = read()) >= '0' && c <= '9');
if (neg)
return -ret;
return ret;
}
public long nextLong() throws IOException
{
long ret = 0;
byte c = read();
while (c <= ' ')
c = read();
boolean neg = (c == '-');
if (neg)
c = read();
do {
ret = ret * 10 + c - '0';
} while ((c = read()) >= '0' && c <= '9');
if (neg)
return -ret;
return ret;
}
public double nextDouble() throws IOException
{
double ret = 0, div = 1;
byte c = read();
while (c <= ' ')
c = read();
boolean neg = (c == '-');
if (neg)
c = read();
do {
ret = ret * 10 + c - '0';
} while ((c = read()) >= '0' && c <= '9');
if (c == '.') {
while ((c = read()) >= '0' && c <= '9') {
ret += (c - '0') / (div *= 10);
}
}
if (neg)
return -ret;
return ret;
}
private void fillBuffer() throws IOException
{
bytesRead = din.read(buffer, bufferPointer = 0,
BUFFER_SIZE);
if (bytesRead == -1)
buffer[0] = -1;
}
private byte read() throws IOException
{
if (bufferPointer == bytesRead)
fillBuffer();
return buffer[bufferPointer++];
}
public void close() throws IOException
{
if (din == null)
return;
din.close();
}
}
public static void main(String[] args) throws IOException {
//Scanner scanner = new Scanner(new File("bfs.in"));
// BufferedReader br = new BufferedReader(new FileReader("bfs.in"));
// StringTokenizer st = new StringTokenizer(br.readLine());
Reader r = new Reader("bfs.in");
int n = r.nextInt();
int[] found = new int[n+1];
Arrays.fill(found, -1);
int m = r.nextInt();
int s = r.nextInt();
found[s] = 0;
Map<Integer, List<Integer>> graph = new HashMap<>();
for (int i = 0; i < m; i++) {
int from = r.nextInt();
int to = r.nextInt();
if (!graph.containsKey(from)) {
graph.put(from, new ArrayList<>());
}
graph.get(from).add(to);
}
Queue<Integer> q = new LinkedList<>();
q.add(s);
while (!q.isEmpty()) {
int curr = q.poll();
for (var next : graph.getOrDefault(curr, List.of())) {
if (found[next] == -1) {
found[next] = found[curr] + 1;
q.add(next);
}
}
}
FileWriter fileWriter = new FileWriter("bfs.out");
PrintWriter printWriter = new PrintWriter(fileWriter);
StringBuilder sb = new StringBuilder();
for (int i = 1; i <= n; i++) {
sb.append(found[i]);
if (i != n) {
sb.append(' ');
}
}
printWriter.write(sb.toString());
printWriter.close();
}
}