WA30pts,求条,玄2关
查看原帖
WA30pts,求条,玄2关
572228
WangSiHan_2011楼主2024/10/10 16:28

已知Tarjan一定错了

#include <bits/stdc++.h>

using namespace std;
const int MAXN = 2000002;

int n,m;
int tid;
int cnt;
int chu[MAXN];
stack <int> s;
int dfn[MAXN];
int low[MAXN];
int scc[MAXN];
bool ins[MAXN];
vector <int> links[MAXN];

void Add(int u,int v) { links[u].push_back(v); }
void Tarjan(int u)
{
    s.push(u);
    ins[u] = true;
    dfn[u] = low[u] = ++tid;

    auto &link = links[u];
    for(auto v : link)
    {
        if(!dfn[v])
        {
            Tarjan(v);
            low[u] = min(low[u],low[v]);
        }
        else if(ins[v])
            low[u] = min(low[u],dfn[v]);
    }

    if(dfn[u] == low[u])
    {
        int top;
        cnt++;
        do
        {
            top = s.top();
            s.pop();
            scc[top] = cnt;
            ins[top] = false;
        }
        while(top != u);
    }
}

int main()
{
    ios::sync_with_stdio(false);
    cin.tie(0),cout.tie(0);

    cin >> n >> m;
    for(int i = 1;i <= m;i++)
    {
        int u,v,x,y;
        cin >> u >> x >> v >> y;
        if(x == 0 && y == 0)
            Add(u + n,v),Add(v + n,u);
        else if(x == 0 && y == 1)
            Add(u + n,v + n),Add(v,u);
        else if(x == 0 && y == 1)
            Add(u,v),Add(v + n,u + n);
        else
            Add(u,v + n),Add(v,u + n);
    }
    
    for(int i = 1;i <= 2 * n;i++)
        if(!dfn[i])
            Tarjan(i);

    for(int i = 1;i <= n;i++)
    {
        if(scc[i] == scc[i + n])
        {
            cout << "IMPOSSIBLE" << endl;
            return 0;
        }
    }

    cout << "POSSIBLE" << endl;
    for(int i = 1;i <= n;i++)
    {
        if(scc[i] > scc[i + n])
            cout << 1 << " ";
        else
            cout << 0 << " ";
    }

    cout << endl;
    return 0;
}
2024/10/10 16:28
加载中...