求助!
查看原帖
求助!
114830
K0stlin楼主2020/5/26 21:58
#include <cstdio>
#define For(x) for(int i=hd[x];i;i=e[i].nxt)
#define v (e[i].to)
typedef long long ll;

const int N=1e6+5;
int n,m,x,y,a,b,num,hd[N<<1];
struct cz {
	int nxt,to;
}e[N<<1];
int dfn[N<<1],low[N<<1],cnt,st[N<<1],pos[N<<1];
bool vis[N<<1];
inline int read() {
	int x=0,flag=0;char ch=getchar();
	while(ch<'0'||ch>'9'){flag|=(ch=='-');ch=getchar();}
	while(ch>='0'&&ch<='9'){x=(x<<3)+(x<<1)+ch-'0';ch=getchar();}
	return flag?-x:x;
}
inline int mx(int x,int y) {return x>y?x:y;}
inline int mn(int x,int y) {return x<y?x:y;}
inline void add(int x,int y) {
	e[++num]=(cz) {hd[x],y};
	hd[x]=num;
}
void dfs(int u) {//tarjan 
	dfn[u]=low[u]=++cnt;
	st[++st[0]]=u; vis[u]=1;
	For(x) {
		if(!dfn[v]) {
			dfs(v);
			low[u]=mn(low[u],low[v]);
		} else if(vis[v])
			low[u]=mn(low[u],dfn[v]);
	}
	if(dfn[u]==low[u]) {
		++pos[0];
		while(st[st[0]]!=u)
			vis[st[st[0]]]=0,
			pos[st[st[0]--]]=pos[0];
		vis[st[st[0]]]=0;
		pos[st[st[0]--]]=pos[0];
	}
}
int main() {
//	freopen(".in","r",stdin);
//	freopen(".out","w",stdout);
	n=read();m=read();
	for(int i=1;i<=m;++i) {
		x=read();a=read();y=read();b=read();
		if(a==1&&b==1) add(x,y+n),add(y,x+n);
		if(a==0&&b==1) add(x+n,y+n),add(y,x);
		if(a==1&&b==0) add(x,y),add(y+n,x+n);
		if(a==0&&b==0) add(x+n,y),add(y+n,x);
	}
	for(int i=1;i<=n*2;++i)
		if(!dfn[i]) dfs(i);
	for(int i=1;i<=n;++i)
		if(pos[i]==pos[i+n]) {
			printf("IMPOSSIBLE\n");
			return 0;
		}
	printf("POSSIBLE\n");
	for(int i=1;i<=n;++i)
		if(pos[i]<pos[i+n]) printf("0 ");
		else printf("1 ");
	return 0;
}

将近两年没求助过人了,今天学2-SAT实在无奈,第一次实现模板这么吃力。

2020/5/26 21:58
加载中...