競プロをしながら、節約と株式投資でセミリタイアを目指す東大卒のブログ

東大卒でメーカー勤務の私がセミリタイアするために投資や競プロを頑張っていこうという趣旨で始めたブログです。独身男性です。火木土日に更新予定です。お金について考えています。

ABC168で書いたコード

using System;
using System.Numerics;
using System.Linq;
using System.Collections.Generic;
using System.Text;
using System.Collections;

namespace debug
{
    class main
    {
        static void Main(string args)
        {
            //問題クラスを展開
            ProgramD a = new ProgramD();
            a.main();//実行する

        }

    }

    class ProgramA
    {
        public void main()
        {
            //入力
            string s = Console.ReadLine();
            //1の位の数を出す
            int one = s[s.Length - 1] - '0';

            //それぞれ条件分岐
            if (one == 3)
                Console.WriteLine("bon");
            else if(one ==0 || one == 1 || one == 6|| one== 8)
                Console.WriteLine("pon");
            else
                Console.WriteLine("hon");

        }
    }

    class ProgramB
    {
        public void main()
        {
            //入力
            int n = int.Parse(Console.ReadLine());
            string s = Console.ReadLine();

            //文字数がn以下ならそのまま出力で終わり
            if (s.Length <= n)
            {
                Console.WriteLine(s);
                return;
            }

            //それ以上ならn文字目まで出力する
            for(int i = 0;i < n;i++)
                Console.Write(s[i]);
            //最後に...をつける
            Console.Write("...");

        }
    }

    class ProgramC
    {
        public void main()
        {
            //入力
            string s = Console.ReadLine().Split(' ');
            int a = int.Parse(s[0]);
            int b = int.Parse(s[1]);
            int h = int.Parse(s[2]);
            int m = int.Parse(s[3]);

            //分針と時針の12時からの角度を出す
            double deg_h = (h / 12.0 + m / 720.0) * 2.0 * Math.PI;
            double deg_m =  m / 60.0 * 2.0 * Math.PI;

            //余弦定理で求める
            Console.WriteLine(Math.Sqrt(a*a + b*b - 2 * a*b*Math.Cos(Math.Abs(deg_h -deg_m))));
                


        }
    }

    class ProgramD
    {
        public void main()
        {
            //入力
            string s = Console.ReadLine().Split(' ');
            int n = int.Parse(s[0]);
            int m = int.Parse(s[1]);

            //これらはインスタンスが作られていないのであらかじめ作る
            List<int> test = new List<int>[100000];

            //インスタンスを入れる
            for (int i = 0i < 100000i++)
                test[i] = new List<int>();


            //リストを入れておく
            for (int i = 0i < mi++)
            {
                string t = Console.ReadLine().Split(' ');
                int a = int.Parse(t[0]);
                int b = int.Parse(t[1]);
                test[a - 1].Add(b - 1);
                test[b - 1].Add(a - 1);
            }

            Queue<intq = new Queue<int>();
            int ans = new int[n - 1];

            //最初のキューを入れておく
            for (int j = 0j < test[0].Count(); j++)
            {
                q.Enqueue(test[0][j]);
                ans[test[0][j] - 1] = 1;
            }

            //全経路探るまで続ける
            while (q.Count != 0)
            {
                //次の推移の候補場所を出す
                for(int i = 0i < q.Count;i++)
                {
                    int k = q.Dequeue();

                    //次の候補場所が未検索であればキューに入れておく
                    for (int j = 0j < test[k].Count(); j++)
                    {
                        //1に戻る場合は飛ばす(相互関係によって起こるのでそれを防ぐ)
                        if (test[k][j] == 0)
                            continue;

                        //もし未検索ならキューを入れる
                        if (ans[test[k][j] - 1] == 0)
                        {
                            q.Enqueue(test[k][j]);
                            ans[test[k][j] - 1] = k + 1;//添え字に注意(ans内は2からなのでもう1引く、kは1引いた状態なので1足して戻す
                        }
                    }

                }

            }

            //あり得ないケースはないので、yesして答を出す
            Console.WriteLine("Yes");
            for (int i = 0i < n - 1i++)
                Console.WriteLine(ans[i]);

        }
    }

    
}