Submission #28020954


Source Code Expand

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

namespace Tasks
{
    public class C
    {
        public static void Main(string[] args)
        {
            var sw = new StreamWriter(Console.OpenStandardOutput()) { AutoFlush = false };
            Console.SetOut(sw);
            Solve();
            Console.Out.Flush();
        }

        public static void Solve()
        {
            var (N, M) = Scanner.Scan<int, int>();
            var E1 = new bool[N, N];
            var E2 = new (int A, int B)[M];
            for (var i = 0; i < M; i++)
            {
                var (a, b) = Scanner.Scan<int, int>();
                a--; b--;
                E1[a, b] = E1[b, a] = true;
            }

            for (var i = 0; i < M; i++)
            {
                var (a, b) = Scanner.Scan<int, int>();
                a--; b--;
                E2[i] = (a, b);
            }

            foreach (var order in Enumerable.Range(0, N).Permute())
            {
                var ok = true;
                foreach (var (c, d) in E2)
                {
                    ok &= E1[order[c], order[d]];
                }

                if (ok)
                {
                    Console.WriteLine("Yes");
                    return;
                }
            }

            Console.WriteLine("No");
        }

        public static class Scanner
        {
            public static T Scan<T>() where T : IConvertible => Convert<T>(ScanLine()[0]);
            public static (T1, T2) Scan<T1, T2>() where T1 : IConvertible where T2 : IConvertible
            {
                var line = ScanLine();
                return (Convert<T1>(line[0]), Convert<T2>(line[1]));
            }
            public static (T1, T2, T3) Scan<T1, T2, T3>() where T1 : IConvertible where T2 : IConvertible where T3 : IConvertible
            {
                var line = ScanLine();
                return (Convert<T1>(line[0]), Convert<T2>(line[1]), Convert<T3>(line[2]));
            }
            public static (T1, T2, T3, T4) Scan<T1, T2, T3, T4>() where T1 : IConvertible where T2 : IConvertible where T3 : IConvertible where T4 : IConvertible
            {
                var line = ScanLine();
                return (Convert<T1>(line[0]), Convert<T2>(line[1]), Convert<T3>(line[2]), Convert<T4>(line[3]));
            }
            public static (T1, T2, T3, T4, T5) Scan<T1, T2, T3, T4, T5>() where T1 : IConvertible where T2 : IConvertible where T3 : IConvertible where T4 : IConvertible where T5 : IConvertible
            {
                var line = ScanLine();
                return (Convert<T1>(line[0]), Convert<T2>(line[1]), Convert<T3>(line[2]), Convert<T4>(line[3]), Convert<T5>(line[4]));
            }
            public static (T1, T2, T3, T4, T5, T6) Scan<T1, T2, T3, T4, T5, T6>() where T1 : IConvertible where T2 : IConvertible where T3 : IConvertible where T4 : IConvertible where T5 : IConvertible where T6 : IConvertible
            {
                var line = ScanLine();
                return (Convert<T1>(line[0]), Convert<T2>(line[1]), Convert<T3>(line[2]), Convert<T4>(line[3]), Convert<T5>(line[4]), Convert<T6>(line[5]));
            }
            public static IEnumerable<T> ScanEnumerable<T>() where T : IConvertible => ScanLine().Select(Convert<T>);
            private static T Convert<T>(string value) where T : IConvertible => (T)System.Convert.ChangeType(value, typeof(T));
            private static string[] ScanLine() => Console.ReadLine()?.Trim().Split(' ') ?? Array.Empty<string>();
        }
    }

    public static partial class EnumerableExtension
    {
        public static IEnumerable<T[]> Permute<T>(this IEnumerable<T> source)
        {
            if (source is null) throw new ArgumentNullException(nameof(source));
            IEnumerable<T[]> Inner()
            {
                var items = source.ToArray();
                var n = items.Length;
                var indices = new int[n];
                for (var i = 0; i < indices.Length; i++)
                {
                    indices[i] = i;
                }
                var result = new T[n];
                void Fill()
                {
                    for (var i = 0; i < n; i++)
                    {
                        result[i] = items[indices[i]];
                    }
                }
                Fill();
                yield return result;
                while (true)
                {
                    var (i, j) = (n - 2, n - 1);
                    while (i >= 0)
                    {
                        if (indices[i] < indices[i + 1]) break;
                        i--;
                    }
                    if (i == -1) yield break;
                    while (true)
                    {
                        if (indices[j] > indices[i]) break;
                        j--;
                    }
                    (indices[i], indices[j]) = (indices[j], indices[i]);
                    Array.Reverse(indices, i + 1, n - 1 - i);
                    Fill();
                    yield return result;
                }
            }
            return Inner();
        }
        public static IEnumerable<IEnumerable<T>> Permute<T>(this IEnumerable<T> source, int count)
        {
            if (source is null) throw new ArgumentNullException(nameof(source));
            IEnumerable<T[]> Inner()
            {
                var items = source.ToArray();
                if (count <= 0 || items.Length < count) throw new ArgumentOutOfRangeException(nameof(count));
                var n = items.Length;
                var indices = new int[n];
                for (var i = 0; i < indices.Length; i++)
                {
                    indices[i] = i;
                }
                var cycles = new int[count];
                for (var i = 0; i < cycles.Length; i++)
                {
                    cycles[i] = n - i;
                }
                var result = new T[count];
                void Fill()
                {
                    for (var i = 0; i < count; i++)
                    {
                        result[i] = items[indices[i]];
                    }
                }
                Fill();
                yield return result;
                while (true)
                {
                    var done = true;
                    for (var i = count - 1; i >= 0; i--)
                    {
                        cycles[i]--;
                        if (cycles[i] == 0)
                        {
                            for (var j = i; j + 1 < indices.Length; j++)
                            {
                                (indices[j], indices[j + 1]) = (indices[j + 1], indices[j]);
                            }
                            cycles[i] = n - i;
                        }
                        else
                        {
                            (indices[i], indices[^cycles[i]]) = (indices[^cycles[i]], indices[i]);
                            Fill();
                            yield return result;
                            done = false;
                            break;
                        }
                    }
                    if (done) yield break;
                }
            }
            return Inner();
        }
    }
}

Submission Info

Submission Time
Task C - Graph Isomorphism
User AconCavy
Language C# (.NET Core 3.1.201)
Score 300
Code Size 7587 Byte
Status AC
Exec Time 94 ms
Memory 28300 KiB

Judge Result

Set Name Sample All
Score / Max Score 0 / 0 300 / 300
Status
AC × 3
AC × 22
Set Name Test Cases
Sample example_00.txt, example_01.txt, example_02.txt
All example_00.txt, example_01.txt, example_02.txt, test_00.txt, test_01.txt, test_02.txt, test_03.txt, test_04.txt, test_05.txt, test_06.txt, test_07.txt, test_08.txt, test_09.txt, test_10.txt, test_11.txt, test_12.txt, test_13.txt, test_14.txt, test_15.txt, test_16.txt, test_17.txt, test_18.txt
Case Name Status Exec Time Memory
example_00.txt AC 91 ms 27908 KiB
example_01.txt AC 78 ms 27984 KiB
example_02.txt AC 78 ms 28244 KiB
test_00.txt AC 94 ms 27760 KiB
test_01.txt AC 83 ms 27872 KiB
test_02.txt AC 84 ms 28300 KiB
test_03.txt AC 79 ms 27772 KiB
test_04.txt AC 75 ms 27944 KiB
test_05.txt AC 83 ms 27752 KiB
test_06.txt AC 84 ms 27872 KiB
test_07.txt AC 87 ms 27760 KiB
test_08.txt AC 81 ms 27876 KiB
test_09.txt AC 86 ms 27968 KiB
test_10.txt AC 74 ms 28016 KiB
test_11.txt AC 76 ms 27956 KiB
test_12.txt AC 86 ms 28092 KiB
test_13.txt AC 90 ms 27920 KiB
test_14.txt AC 78 ms 27964 KiB
test_15.txt AC 78 ms 27812 KiB
test_16.txt AC 84 ms 27756 KiB
test_17.txt AC 78 ms 27876 KiB
test_18.txt AC 78 ms 27924 KiB