Esempio n. 1
0
    public TwoSatSolver(int n, int[] vs, int[] us, bool[] vb, bool[] ub)
    {
        N = n;
        G = new List <int> [2 * N];
        for (int i = 0; i < 2 * N; i++)
        {
            G[i] = new List <int>();
        }
        for (int i = 0; i < vs.Length; i++)
        {
            G[vs[i] + (vb[i] ? N : 0)].Add(us[i] + (ub[i] ? 0 : N));
            G[us[i] + (ub[i] ? N : 0)].Add(vs[i] + (vb[i] ? 0 : N));
        }
        StrongConnectedGraph Scc = new StrongConnectedGraph(G);

        OK = true;
        for (int i = 0; i < N; i++)
        {
            OK &= !Scc.SameAffilication(i, i + N);
        }
    }
Esempio n. 2
0
    void Calc()
    {
        int N = re.i();
        int M = re.i();

        G        = new List <int> [N];
        order    = new List <int> [N];
        revG     = new List <int> [N];
        revorder = new List <int> [N];
        for (int j = 0; j < N; j++)
        {
            G[j]        = new List <int>();
            order[j]    = new List <int>();
            revG[j]     = new List <int>();
            revorder[j] = new List <int>();
        }
        for (int j = 0; j < M; j++)
        {
            int f = re.i() - 1;
            int t = re.i() - 1;
            G[f].Add(t);
            revG[t].Add(f);
            order[f].Add(j);
            revorder[t].Add(j);
        }
        bool[] Changed = new bool[M];
        for (int i = 0; i < N; i++)
        {
            int[] OK1 = new int[N];
            OK1[i] = N + 5;
            for (int j = 0; j < G[i].Count; j++)
            {
                dfs(G[i][j], j + 1, OK1);
            }
            int[] OK2 = new int[N];
            OK2[i] = N + 5;
            for (int j = G[i].Count - 1; j >= 0; j--)
            {
                dfs(G[i][j], j + 1, OK2);
            }
            for (int j = 0; j < G[i].Count; j++)
            {
                if (OK1[G[i][j]] != j + 1 || OK2[G[i][j]] != j + 1)
                {
                    Changed[order[i][j]] = !Changed[order[i][j]];
                }
            }
        }
        StrongConnectedGraph Scc = new StrongConnectedGraph(G);

        for (int i = 0; i < N; i++)
        {
            for (int j = 0; j < revG[i].Count; j++)
            {
                if (Scc.SameAffilication(i, revG[i][j]))
                {
                    Changed[revorder[i][j]] = !Changed[revorder[i][j]];
                }
            }
        }
        for (int i = 0; i < M; i++)
        {
            if (Changed[i])
            {
                sb.Append("diff\n");
            }
            else
            {
                sb.Append("same\n");
            }
        }
    }