求助,WA#2
查看原帖
求助,WA#2
224358
清平乐楼主2020/9/30 10:23
#include<stdio.h>
#include<bits/stdc++.h>
#define min(a,b) ((a)<(b)?(a):(b))
using namespace std;

const int N=2e6+5;
int n,m,k,tot,cnt,i,a,j,b;
int head[N],dfn[N],low[N],belong[N];
bool vis[N];
struct edge{
	int v,next;
}e[N<<1];
stack<int>s;

inline void add(int u,int v)
{
	e[++k]=(edge){v,head[u]};
	head[u]=k;
}

void tarjan(int u)
{
	int v=0;
	dfn[u]=low[u]=++tot;
	s.push(u),vis[u]=true;
	for(register int i=head[u];i;i=e[i].next)
		if(!dfn[v=e[i].v])
		{
			tarjan(v);
			low[u]=min(low[u],low[v]);
		}
		else if(vis[v]) low[u]=min(low[u],dfn[v]);
	if(low[u]==dfn[u])
	{
		++cnt;
		while(v!=u)
		{
			v=s.top();
			s.pop();
			belong[v]=cnt;
			vis[v]=false;
		}
	}
}

int main(void)
{
	scanf("%d%d",&n,&m);
	while(m--)
	{
		scanf("%d%d%d%d",&i,&a,&j,&b);
		add(i+(a&1)*n,j+(b^1)*n),add(j+(b&1)*n,i+(a^1)*n);
	}
	for(register int i=1;i<=n<<1;++i)
		if(!dfn[i]) tarjan(i);
	for(register int i=1;i<=n;++i)
		if(belong[i]==belong[i+n]) return !printf("IMPOSSIBLE\n");
	puts("POSSIBLE");
	for(register int i=1;i<=n;++i)
		printf("%d ",belong[i]<belong[i+n]);
	return 0;
}
2020/9/30 10:23
加载中...