Problem:
パーティー

問題

あなたはクリスマスパーティーに学校内の自分の友達と，自分の友達の友達を招待することにした．
あなたの通う学校の生徒数は n 人であり，それぞれの生徒には 1 から n までの番号が割り振られている．
あなたの番号は 1 である．
あなたの手元には，誰と誰が友達であるかを記したリストがある．
このリストをもとに，
あなたがクリスマスパーティーに招待する生徒数を求めるプログラムを作成せよ．

入力

入力は複数のデータセットからなる．各データセットは以下の形式で与えられる．

データセットの1 行目には学校の生徒数 n （2 ≤ n ≤ 500）が，
2 行目にはリストの長さ m （1 ≤ m ≤ 10000）が書かれている．
入力は全部で 2+m 行からなる．2+i 行目（1 ≤ i ≤ m）には 2 つの整数 ai と bi （1 ≤ ai < bi ≤ n）が空白区切りで書かれており，番号 ai と番号 bi の生徒が友達同士であることを表す．
3 行目から 2+m 行目には同じ友達関係を表す行が重複して現れることはない．

n, m がともに 0 のとき入力の終了を示す.データセットの数は 5 を超えない．

出力

データセットごとに，あなたがクリスマスパーティーに招待する生徒数を1 行に出力する．

入出力例

入力例

6
5
1 2
1 3
3 4
2 3
4 5
6
5
2 3
3 4
4 5
5 6
2 5
0
0

出力例

3
0

1つ目の入力例 において，あなたの友達は番号 2 と番号 3 の生徒の 2 人である．
また，番号 3 と番号 4 の生徒は友達同士であるので，
番号 4 の生徒はあなたの友達の友達である．
番号 5 と番号 6 の生徒はあなたの友達でもなく，あなたの友達の友達でもない．
したがって，あなたは番号 2,3,4 の 3 人の生徒をクリスマスパーティーに招待する．

2つ目の入力例 において，あなたには友達はいない．
したがって，あなたがクリスマスパーティーに招待する生徒数は 0 人である．

上記問題文と自動審判に使われるデータは、情報オリンピック日本委員会が作成し公開している問題文と採点用テストデータです。

Solution in C# (judge verdict: Accepted)

using System;
using System.Collections.Generic;
using System.Linq;

class Edge {
    public int Fm { get; private set; }
    public int To { get; private set; }
    public int Cost { get; private set; }

    public Edge(int fm, int to, int cost) {
        Fm = fm;
        To = to;
        Cost = cost;
    }
}

class ShortestPath {
    static int ReadInt() {
        return int.Parse(Console.ReadLine());
    }

    static int[] ReadInts() {
        return Console.ReadLine().Trim().Split().Select(int.Parse).ToArray();
    }

    static void BellmanFord(int src, int n, Edge[] edges) {
        const int INF = 1000000000;
        int[] d = new int[n];
        for (int i = 0; i < n; i++) d[i] = INF;

        d[src] = 0; // ????§??????????
        for (int i = 0; i < n; i++) {
            foreach (Edge e in edges) {
                if (d[e.To] > d[e.Fm] + e.Cost) {
                    d[e.To] = d[e.Fm] + e.Cost;
                }
            }
        }

//        bool isExistsNegativeLoop = false; // ????????????????????????
//        foreach (Edge e in edges) {
//            if (d[e.Fm] + e.Cost < d[e.To]) {
//                isExistsNegativeLoop = true;
//                break;
//            }
//        }

        int ans = 0;
        for (int i = 1; i < n; i++) {
            if (d[i] <= 2) { // ????????????????????§????????????
                ans++;
            }
        }
        Console.WriteLine(ans);
    }

    static void Main() {
        while (true) {
            int n = ReadInt();
            if (n == 0) break;

            int m = ReadInt();
            Edge[] edges = new Edge[m*2];
            for (int i = 0; i < m; i++) {
                var ab = ReadInts();
                edges[2*i] = new Edge(ab[0]-1, ab[1]-1, 1);
                edges[2*i+1] = new Edge(ab[1]-1, ab[0]-1, 1);
            }
            BellmanFord(0, n, edges);
        }
    }
}