Problem:
MathJax.Hub.Config({ tex2jax: { inlineMath: [["$","$"], ["\\(","\\)"]], processEscapes: true }});

Breadth First Search

Write a program which reads an directed graph $G = (V, E)$, and finds the shortest distance from vertex $1$ to each vertex (the number of edges in the shortest path). Vertices are identified by IDs $1, 2, ... n$.

Input

In the first line, an integer $n$ denoting the number of vertices, is given. In the next $n$ lines, adjacent lists of vertex $u$ are given in the following format:

$u$ $k$ $v_1$ $v_2$ ... $v_k$

$u$ is ID of the vertex and $k$ denotes its degree.$v_i$ are IDs of vertices adjacent to $u$.

Constraints

$1 \leq n \leq 100$

Output

For each vertex $u$, print $id$ and $d$ in a line. $id$ is ID of vertex $u$ and $d$ is the distance from vertex $1$ to vertex $u$. If there are no path from vertex $1$ to vertex $u$, print -1 as the shortest distance. Print in order of IDs.

Sample Input 1

4
1 2 2 4
2 1 4
3 0
4 1 3

Sample Output 1

1 0
2 1
3 2
4 1

Reference

Introduction to Algorithms, Thomas H. Cormen, Charles E. Leiserson, Ronald L. Rivest, and Clifford Stein. The MIT Press.

Solution in C# (judge verdict: Accepted)

using System;
using System.Collections.Generic;
					
public class Program
{	
	public static void Main()
	{
		int n = int.Parse(Console.ReadLine());
		
		int[,] G = new int[n,n];
		
		for(int i = 0; i < n; i++) {
			int[] u = Array.ConvertAll(Console.ReadLine().Split(" ".ToCharArray()), int.Parse);
			
			for(int j = 0; j < u[1];  j++) {
				G[u[0]-1, u[j+2]-1] = 1;
			}
		}
		
		Node[] nodes = new Node[n];
		for(int i = 0; i < n; i++) {
			nodes[i] = new Node(i);
		}
		
		for(int i = 0; i < n; i++) {
			for(int j = 0; j < n; j++) {
				if(G[i,j] != 0) { 
					nodes[i].Children.Add(nodes[j]);
				}
			}
		}
		
		for(int i = 0; i < n; i++) {
			for(int j = 0; j < n; j++) nodes[j].Added = false;
			BFS(nodes[0], nodes[i], nodes[0].Children.ToArray());
		}
		
		for(int i = 0; i < n; i++) {
			Console.WriteLine(nodes[i]);
		}
	}
	
	static void BFS(Node start, Node goal,Node[] onWays)
	{
		if(start == goal) return;
		else {
			goal.d++;
			
			List<Node> nexts = new List<Node>();
			foreach (var o in onWays) {
				if(o == goal) return;
				
				if(!o.Added) {
					foreach(Node p in o.Children.ToArray()){
						if(p != start) nexts.Add(p);
					}
					o.Added = true;
				}
			}
			if(nexts.Count != 0) BFS(start, goal, nexts.ToArray());
			else goal.d = -1;
		}
	}
	
}

class Node
{
	public bool Added = false;
	public int d;
	public int Id { get; private set; }
	public List<Node> Children = new List<Node>();
	
	public Node (int id)
	{
		this.Id = id;
	}
	
	public override string ToString()
	{
		return (Id + 1) + " " + d;
	}
}