#include <cstdio>
#include <algorithm>
#define N 8010
#define M 20010
int n, m;
int dfn[N << 1], low[N << 1], scc[N << 1], dfs_id, scc_id;
int stk[N << 1], top, in[N << 1];
struct T {
int head, to, nxt;
} a[M << 1];
int tot;
void add(int u, int v) {
a[++tot].to = v;
a[tot].nxt = a[u].head;
a[u].head = tot;
}
inline int get(int x) {
return x & 1 ? x + 1 : x - 1;
}
void dfs(int u) {
dfn[u] = low[u] = ++dfs_id;
stk[++top] = u;
in[u] = 1;
for (int i = a[u].head; i; i = a[i].nxt) {
int v = a[i].to;
if (!dfn[v]) {
dfs(v);
low[u] = std::min(low[u], low[v]);
} else if (in[v]) {
low[u] = std::min(low[u], dfn[v]);
}
}
if (dfn[u] == low[u]) {
scc_id++;
while (top) {
int now = stk[top--];
scc[now] = scc_id;
in[now] = 0;
if (now == u)
break;
}
}
}
int main() {
scanf("%d %d", &n, &m);
for (int i = 1, u, v; i <= m; i++) {
scanf("%d %d", &u, &v);
add(u, get(v));
add(v, get(u));
}
for (int i = 1; i <= n << 1; i++) {
if (!dfn[i])
dfs(i);
}
for (int i = 1; i <= n << 1; i += 2) {
if (scc[i] == scc[i + 1]) {
puts("NIE");
return 0;
}
}
for (int i = 1; i <= n << 1; i += 2) {
printf("%d\n", scc[i] < scc[i + 1] ? i : i + 1);
}
return 0;
}
一本通1519:和平委员会
最新推荐文章于 2024-10-06 14:10:45 发布