コード例 #1
0
    public static long Calc(int n)
    {
        n >>= 3;
        long ans   = 0;
        var  graph = new SCCGraph(n);

        for (int i = 0; i < n; i++)
        {
            graph.AddEdge(i, (int)((1000000007L * i) % n));
        }
        ans = graph.SCC().Length;
        return(ans);
    }
コード例 #2
0
ファイル: G.cs プロジェクト: AconCavy/atcoder-csharp
        public static void Solve()
        {
            var(N, M) = Scanner.Scan <int, int>();
            var G = new SCCGraph(N);

            for (var i = 0; i < M; i++)
            {
                var(u, v) = Scanner.Scan <int, int>();
                G.AddEdge(u, v);
            }

            var scc = G.GetSCC();

            Console.WriteLine(scc.Count());
            foreach (var v in scc)
            {
                Console.WriteLine($"{v.Count()} {string.Join(" ", v)}");
            }
        }
コード例 #3
0
ファイル: QuestionA.cs プロジェクト: terry-u16/AtCoder
        public override IEnumerable <object> Solve(TextReader inputStream)
        {
            var(nodeCount, edgeCount) = inputStream.ReadValue <int, int>();
            var graph = new SCCGraph(nodeCount);

            for (int i = 0; i < edgeCount; i++)
            {
                var(u, v) = inputStream.ReadValue <int, int>();
                graph.AddEdge(u, v);
            }

            var sccs = graph.SCC();

            yield return(sccs.Count);

            foreach (var scc in sccs)
            {
                yield return($"{scc.Count} {scc.Join(' ')}");
            }
        }
コード例 #4
0
ファイル: 666705.cs プロジェクト: qifanyyy/CLCDSA
        public void Solve()
        {
            var n = sc.Integer();
            var a = sc.Integer();
            var F = new int[a];
            var T = new int[a];

            for (int i = 0; i < a; i++)
            {
                F[i] = sc.Integer() - 1;
                T[i] = sc.Integer() - 1;
            }
            var b = sc.Integer();
            var A = new int[b];
            var B = new int[b];

            for (int i = 0; i < b; i++)
            {
                A[i] = sc.Integer() - 1;
                B[i] = sc.Integer() - 1;
            }
            var max = 0;

            for (int i = 0; i < 1 << b; i++)
            {
                var G = new SCCGraph(n);
                for (int j = 0; j < a; j++)
                {
                    G.AddEdge(T[j], F[j]);
                }


                var dame = new bool[n];
                for (int j = 0; j < b; j++)
                {
                    if ((i >> j & 1) == 1)
                    {
                        G.AddEdge(A[j], B[j]);
                    }
                    else
                    {
                        dame[A[j]] = true;
                    }
                }
                G.Build();
                var ok = Enumerate(G.Size, x => true);
                for (int j = 0; j < G.Size; j++)
                {
                    if (G.S[j].Count > 1 || ok[j] == false || dame[G.S[j][0]])
                    {
                        ok[j] = false;
                        foreach (var to in G.G[j])
                        {
                            ok[to.to] = false;
                        }
                    }
                }
                var cnt = ok.Count(x => x);
                max = Math.Max(max, cnt);
                Debug.WriteLine(cnt);
            }
            IO.Printer.Out.WriteLine(max);
        }
コード例 #5
0
ファイル: H.cs プロジェクト: AconCavy/atcoder-csharp
 public TwoSat(int n = 0)
 {
     _n      = n;
     _answer = new bool[n];
     _scc    = new SCCGraph(2 * n);
 }