后面几个点没有对,不知道是哪里出来了问题啊。
#include <bits/stdc++.h>
#define int long long
const int N = 2e6;
int n, m; int ans[N];
int h[N], e[N], ne[N], idx;
int stk[N], top, in_stk[N];
int timestamp, dfn[N], low[N];
int size[N], scc_cnt, id[N];
inline void add(int a, int b)
{
e[idx] = b;
ne[idx] = h[a];
h[a] = idx ++ ;
}
void tarjan(int u)
{
dfn[u] = low[u] = ++ timestamp;
stk[ ++ top] = u; in_stk[u] = true;
for (int i = h[u]; i != -1; i = ne[i])
{
int j = e[i];
if (!dfn[j])
{
tarjan(j);
low[u] = std::min(low[u], low[j]);
}
else if (in_stk[j])
low[u] = std::min(low[u], dfn[j]);
}
if (dfn[u] == low[u])
{
int y;
scc_cnt ++ ;
do
{
y = stk[top -- ];
in_stk[y] = false;
id[y] = scc_cnt;
size[scc_cnt] ++ ;
} while (y != u);
}
}
signed main()
{
memset(h, -1, sizeof(h));
std::cin >> n >> m;
while (m -- )
{
int i, a, j, b;
std::cin >> i >> a >> j >> b;
add((2 * i + a) ^ 1, 2 * j + b);
add((2 * j + b) ^ 1, 2 * i + a);
}
for (int i = 2; i <= (n << 1 | 1); i ++ )
if (!dfn[i]) tarjan(i);
for (int i = 1; i <= n; i ++ )
{
if (id[i << 1] == id[i << 1 | 1])
{
std::cout << "IMPOSSIBLE" << std::endl;
exit(0);
}
else if (id[i << 1] > id[i << 1 | 1])
ans[i] = 1;
else ans[i] = 0;
}
std::cout << "POSSIBLE" << std::endl;
for (int i = 1; i <= n; i ++ )
std::cout << ans[i] << " ";
std::cout << std::endl;
return 0;
}