MLE.....求助优化
查看原帖
MLE.....求助优化
200116
dshzsh楼主2020/8/4 16:00
#include<bits/stdc++.h>
using namespace std;
const int maxn=2e6+10;
vector <int> mp1[maxn],mp2[maxn];
int p[maxn],tot,fa[maxn],wz[maxn];
bool vis[maxn];
int n,m;
void dfs1(int x)
{
	vis[x]=1;
	int ss=mp1[x].size();
	for(int i=0;i<ss;i++)
	{
		int sx=mp1[x][i];
		if(!vis[sx])
			dfs1(sx);
	}
	p[++tot]=x;
}
void dfs2(int x,int y)
{
	vis[x]=0;
	fa[x]=y;
	if(wz[y]==0) wz[y]=++tot;
	int ss=mp2[x].size();
	for(int i=0;i<ss;i++)
	{
		int sx=mp2[x][i];
		if(vis[sx])
			dfs2(sx,y);
	}
}
int main()
{
	scanf("%d%d",&n,&m);
	for(int i=1;i<=m;i++)
	{
		int x,ix,y,iy;
		scanf("%d%d%d%d",&x,&ix,&y,&iy);
		mp1[x+!ix*n].push_back(y+iy*n);
		mp1[y+!iy*n].push_back(x+ix*n);
		mp2[y+iy*n].push_back(x+!ix*n);
		mp2[x+ix*n].push_back(y+!iy*n);
	}
	tot=0;
	for(int i=1;i<=n*2;i++)
		if(!vis[i])
			dfs1(i);
	tot=0;
	for(int i=n*2;i>=1;i--)
		if(vis[p[i]])
			dfs2(p[i],p[i]);
	bool ok=1;
	for(int i=1;i<=n;i++)
		if(fa[i]==fa[i+n])
		{
			ok=0;
			break;
		}
	if(ok==0)
		printf("IMPOSSIBLE");
	else
	{
		printf("POSSIBLE\n");
		for(int i=1;i<=n;i++)
		{
			if(wz[fa[i]]<wz[fa[i+n]])
				printf("1 ");
			else printf("0 ");
		}
	}
	return 0;
}
2020/8/4 16:00
加载中...