結果

問題 No.241 出席番号(1)
ユーザー eitaho
提出日時 2015-07-10 22:39:05
言語 C#
(csc 2.8.2.62916)
結果
AC  
実行時間 40 ms
コード長 3,617 Byte
コンパイル時間 2,293 ms
使用メモリ 9,764 KB
最終ジャッジ日時 2019-01-12 21:25:33

テストケース

テストケース表示
入力 結果 実行時間
使用メモリ
challenge01.txt AC 37 ms
9,660 KB
challenge02.txt AC 36 ms
9,676 KB
sample1.txt AC 36 ms
9,660 KB
sample2.txt AC 37 ms
9,652 KB
sample3.txt AC 37 ms
9,672 KB
system_test1.txt AC 37 ms
9,684 KB
system_test2.txt AC 38 ms
9,744 KB
system_test3.txt AC 37 ms
9,752 KB
test1.txt AC 36 ms
9,644 KB
test2.txt AC 36 ms
9,664 KB
test3.txt AC 36 ms
9,656 KB
test4.txt AC 36 ms
9,680 KB
test5.txt AC 36 ms
9,656 KB
test6.txt AC 37 ms
9,660 KB
test7.txt AC 37 ms
9,660 KB
test8.txt AC 38 ms
9,700 KB
test9.txt AC 38 ms
9,752 KB
test10.txt AC 38 ms
9,752 KB
test11.txt AC 38 ms
9,756 KB
test12.txt AC 40 ms
9,748 KB
test13.txt AC 38 ms
9,752 KB
test14.txt AC 38 ms
9,752 KB
test15.txt AC 38 ms
9,756 KB
test16.txt AC 38 ms
9,764 KB
テストケース一括ダウンロード
コンパイルメッセージ
Microsoft (R) Visual C# Compiler version 2.8.2.62916 (2ad4aabc)
Copyright (C) Microsoft Corporation. All rights reserved.

ソースコード

diff #
using System;
using System.IO;
using System.Linq;
using System.Text;
using System.Collections.Generic;
using System.Diagnostics;
using System.Numerics;
using Enu = System.Linq.Enumerable;

class Program
{
    public void Solve()
    {
        int N = Reader.Int();
        var Bad = Reader.IntArray(N);
        var matching = new BipartiteMatching(N * 2);

        for (int i = 0; i < N; i++)
            for (int d = 0; d < N; d++)
                if (d != Bad[i])
                    matching.AddEdge(i, N + d);
        int x = matching.Run();
        if (x < N)
            Console.WriteLine(-1);
        else
            for (int i = 0; i < N; i++)
                Console.WriteLine(matching.match[i] - N);
    }


    class BipartiteMatching
    {
        int V;
        List<int>[] G;
        public int[] match;
        bool[] seen;

        public BipartiteMatching(int V)
        {
            this.V = V;
            G = Enumerable.Range(0, V).Select(i => new List<int>()).ToArray();
            match = Enumerable.Repeat(-1, V).ToArray();
        }
        public void AddEdge(int a, int b)
        {
            G[a].Add(b);
            G[b].Add(a);
        }
        public int Run()
        {
            int res = 0;
            for (int i = 0; i < V; i++)
            {
                if (match[i] < 0)
                {
                    seen = new bool[V];
                    if (DFS(i)) res++;
                }
            }
            return res;
        }
        bool DFS(int v)
        {
            seen[v] = true;
            foreach (int next in G[v])
            {
                int m = match[next];
                if (m < 0 || !seen[m] && DFS(m))
                {
                    match[v] = next;
                    match[next] = v;
                    return true;
                }
            }
            return false;
        }
    }

}



class Entry { static void Main() { new Program().Solve(); } }
class Reader
{
    private static TextReader reader = Console.In;
    private static readonly char[] separator = { ' ' };
    private static readonly StringSplitOptions op = StringSplitOptions.RemoveEmptyEntries;
    private static string[] A = new string[0];
    private static int i;
    private static void Init() { A = new string[0]; }
    public static void Set(TextReader r) { reader = r; Init(); }
    public static void Set(string file) { reader = new StreamReader(file); Init(); }
    public static bool HasNext() { return CheckNext(); }
    public static string String() { return Next(); }
    public static int Int() { return int.Parse(Next()); }
    public static long Long() { return long.Parse(Next()); }
    public static double Double() { return double.Parse(Next()); }
    public static int[] IntLine() { return Array.ConvertAll(Split(Line()), int.Parse); }
    public static int[] IntArray(int N) { return Enu.Range(0, N).Select(i => Int()).ToArray(); }
    public static int[][] IntTable(int H) { return Enu.Range(0, H).Select(i => IntLine()).ToArray(); }
    public static string[] StringArray(int N) { return Enu.Range(0, N).Select(i => Line()).ToArray(); }
    public static string Line() { return reader.ReadLine().Trim(); }
    private static string[] Split(string s) { return s.Split(separator, op); }
    private static string Next() { CheckNext(); return A[i++]; }
    private static bool CheckNext()
    {
        if (i < A.Length) return true;
        string line = reader.ReadLine();
        if (line == null) return false;
        if (line == "") return CheckNext();
        A = Split(line);
        i = 0;
        return true;
    }
}
0