コード例 #1
0
        public static void Run()
        {
            using (FastScanner fs = new FastScanner(new BufferedStream(Console.OpenStandardInput())))
            using (StreamWriter writer = new StreamWriter(new BufferedStream(Console.OpenStandardOutput())))
            {
                int n = fs.NextInt(), m = fs.NextInt();
                int[] p = new int[n];
                DisjointSet dsu = new DisjointSet();
                for (int i = 0; i < n; i++)
                {
                    p[i] = fs.NextInt() - 1;
                    dsu.MakeSet(i);
                }
                for (int i = 0; i < m; i++)
                {
                    int u = fs.NextInt() - 1, v = fs.NextInt() - 1;
                    dsu.Union(p[u], p[v]);
                }

                LinkedList<int>[] lists = new LinkedList<int>[n];
                for (int i = n - 1; i >= 0; i--)
                {
                    int set = dsu.FindSet(i);
                    if (lists[set] == null) lists[set] = new LinkedList<int>();
                    lists[set].AddLast(i);
                }
                for (int i = 0; i < n; i++)
                {
                    int set = dsu.FindSet(p[i]);
                    writer.Write(lists[set].First() + 1 + " ");
                    lists[set].RemoveFirst();
                }
            }
        }
コード例 #2
0
 public static void Run()
 {
     using (FastScanner fs = new FastScanner(new BufferedStream(Console.OpenStandardInput())))
     using (StreamWriter writer = new StreamWriter(new BufferedStream(Console.OpenStandardOutput())))
     {
         int n = fs.NextInt();
         DisjointSet dsu = new DisjointSet();
         List<string> cycles = new List<string>();
         for (int i = 1; i <= n; i++) 
         {
             dsu.MakeSet(i);
         }
         for (int i = 0; i < n - 1; i++)
         {
             int a = fs.NextInt(), b = fs.NextInt();
             if (dsu.FindSet(a) == dsu.FindSet(b)) cycles.Add(a + " " + b);
             else dsu.Union(a, b);
         }
         HashSet<int> hashSet = new HashSet<int>();
         for (int i = 1; i <= n; i++)
         {
             hashSet.Add(dsu.FindSet(i));
         }
         int[] leaders = hashSet.ToArray();
         writer.WriteLine(leaders.Length - 1);
         int j = 0;
         for (int i = 0; i < leaders.Length - 1; i++)
         {
             writer.WriteLine(cycles[j++] + " " + leaders[i] + " " + leaders[i + 1]);
         }
     }
 }