已知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;
}