最后的条件判断处比较疑惑
查看原帖
最后的条件判断处比较疑惑
116524
ShanireZ楼主2022/6/25 11:10
#include <algorithm>
#include <iostream>
using namespace std;
#define MX 8000005
int n, m, k, epos, npos, spos, gpos;
int to[MX], pre[MX], last[MX];
int dfn[MX], low[MX], g[MX], s[MX];
void addEdge(int u, int v)
{
    pre[++epos] = last[u];
    last[u] = epos, to[epos] = v;
}
void tarjan(int now)
{
    dfn[now] = low[now] = ++npos;
    s[++spos] = now;
    for (int i = last[now]; i != 0; i = pre[i])
    {
        int t = to[i];
        if (dfn[t] == 0)
        {
            tarjan(t);
            low[now] = min(low[now], low[t]);
        }
        else if (g[t] == 0)
        {
            low[now] = min(low[now], dfn[t]);
        }
    }
    if (dfn[now] == low[now])
    {
        gpos++;
        while (s[spos] != now)
        {
            g[s[spos--]] = gpos;
        }
        g[s[spos--]] = gpos;
    }
}
int main()
{
    cin >> n >> m >> k;
    for (int i = 1; i <= m; i++)
    {
        int a, b;
        cin >> a >> b;
        addEdge(a + n, b);
        addEdge(b + n, a);
    }
    for (int i = 1; i <= k; i++)
    {
        int w, a, b;
        cin >> w;
        for (int j = 1; j <= w; j++)
        {
            cin >> a;
            addEdge(a, n * 2 + a);
            addEdge(n * 3 + a, a + n);
            if (j > 1)
            {
                addEdge(a, n * 3 + b);
                addEdge(n * 2 + b, n + a);
                addEdge(n * 2 + b, n * 2 + a);
                addEdge(n * 3 + a, n * 3 + b);
            }
            b = a;
        }
    }
    for (int i = 1; i <= n * 4; i++)
    {
        if (dfn[i] == 0)
        {
            tarjan(i);
        }
    }
    for (int i = 1; i <= n; i++)
    {
        if (g[i] == g[i + n] || g[i + n * 2] == g[i + n * 3] || g[i] == g[i + n * 3])//为何此处不能加第三个条件?
        {
            cout << "NIE" << endl;
            return 0;
        }
    }
    cout << "TAK" << endl;
    return 0;
}

为何最后的判定时,不能加上第三个条件?当前点是关键点,和前缀区域(包含当前点)不含有关键点应该是冲突的吧?

2022/6/25 11:10
加载中...