P4782 2-SAT WA50pts求调(过不了样例
查看原帖
P4782 2-SAT WA50pts求调(过不了样例
1046448
Polaris_flame楼主2023/11/25 11:58

提交记录

#include<bits/stdc++.h>
#define FL(i,a,b) for(int i=(a);i<=(b);i++)
#define FR(i,a,b) for(int i=(a);i>=(b);i--)
#define ll long long
using namespace std;
const int MAXN = 2e6 + 10;
const int MAXM = 2e6 + 10;

int n,m,cnt=0,tot=0,top=0,sum=0;
int head[MAXN],sd[MAXN],dfn[MAXN],low[MAXN];
int s[MAXN],vis[MAXN];
struct node{
    int u,v,nxt;
}e[MAXM];
void add_edge(int x,int y){
    e[++cnt].nxt=head[x];
    e[cnt].u=x;
    e[cnt].v=y;
    head[x]=cnt;
}
void tarjan(int x){
    low[x]=dfn[x]=++tot;
    s[++top]=x;
	vis[x]=1;
    for(int i=head[x];i;i=e[i].nxt){
        int v=e[i].v;
        if(!dfn[v]){
        	tarjan(v);
        	low[x]=min(low[x],low[v]);
    	}
        else if (vis[v]){
            low[x]=min(low[x],low[v]);
        }
    }
    if(dfn[x]==low[x]){
        int y;
        while(s[top]){
        	int y=s[top--];
            sd[y]=x;
            vis[y]=0;
            if(x==y) break;
        }
    }
}
int main(){
    scanf("%d%d",&n,&m);
    FL(i,1,m){
        int x,a,y,b;
        scanf("%d%d%d%d",&x,&a,&y,&b);
        if(a==0&&b==0){
            add_edge(x,y+n);     
            add_edge(y,x+n);     
        }
        else if(a==0&&b==1){
            add_edge(x,y);
            add_edge(y+n,x+n); 
        }
        else if(a==1&&b==0){
            add_edge(x+n,y+n);   
            add_edge(y,x);  
        }
        else if(a==1&&b==1){
            add_edge(x+n,y);
            add_edge(y+n,x);
        }
    }
    FL(i,1,2*n){
    	if(!dfn[i]) tarjan(i);
	}
	FL(i,1,n){
		if(sd[i]==sd[i+n]){
			printf("IMPOSSIBLE\n");
			return 0;
		}
	}
	printf("POSSIBLE\n");
	FL(i,1,n){
		if(sd[i+n]>sd[i]) printf("1 ");
		else printf("0 ");
	}
    return 0;
}
2023/11/25 11:58
加载中...