蒟蒻疯了,求助
查看原帖
蒟蒻疯了,求助
202224
asd0342楼主2020/8/4 16:29
#include<bits/stdc++.h>
#define fd(i,j) i+n*j
using namespace std;
int n,m,tot,cnt;
int a[2000010],head[2][2000010],z[2000010],f[2000010],fz[2000010];
bool vis[2000010];
struct EDGE
{
	int v,nxt;
}g[2][2000010];
void add(int u,int v)
{
	g[0][tot].v=v;
	g[0][tot].nxt=head[0][u];
	head[0][u]=tot;
	g[1][tot].v=u;
	g[1][tot].nxt=head[1][v];
	head[1][v]=tot++;
}
void intl()
{
	tot=0;
	cnt=0;
	memset(head,-1,sizeof(head));
}
void dfs1(int x)
{
	vis[x]=1;
	for(int i=head[0][x],v;~i;i=g[0][i].nxt)
		if(!vis[v=g[0][i].v]) dfs1(v);
	z[++cnt]=x;
	fz[x]=cnt;
}
void dfs2(int x,int y)
{
	f[x]=y;
	vis[x]=0;
	for(int i=head[1][x],v;~i;i=g[1][i].nxt)
		if(vis[v=g[1][i].v]) dfs2(v,y);
}
void jud()
{
	for(int i=1;i<=n;i++)
		if(f[fd(i,0)]==f[fd(i,1)])
		{
			printf("IMPOSSIBLE\n");
			return;
		}
	printf("POSSIBLE\n");
	for(int i=1;i<=n;i++)
	{
		if(fz[fd(i,0)]<fz[fd(i,1)]) printf("1 ");
		else printf("0 ");
	}
	return;
}
int main()
{
	intl();
	scanf("%d%d",&n,&m);
	for(int i=1;i<=m;i++)
	{
		int x,y,q,p;
		scanf("%d%d%d%d",&x,&p,&y,&q);
		int fp=p^1,fq=q^1;
		add(fd(x,fp),fd(y,q));
		add(fd(y,fq),fd(y,p));
	}
	for(int i=1;i<=2*n;i++)
		if(!vis[i]) dfs1(i);
	for(int i=2*n;i>=1;i--)
		if(vis[z[i]]) dfs2(z[i],z[i]);
	jud();
	return 0;
}

只过了第三个点QWQ

2020/8/4 16:29
加载中...