P4782 60pts TLE求条
  • 板块题目总版
  • 楼主CSZ7943
  • 当前回复0
  • 已保存回复0
  • 发布时间2025/1/23 10:06
  • 上次更新2025/1/23 12:13:00
查看原帖
P4782 60pts TLE求条
1320239
CSZ7943楼主2025/1/23 10:06
#include<iostream>
#include<cstdio>
#include<stack>
using namespace std;
int n,m;
struct node{
	int v,nxt;
}a[4001000];
int num,head[1001000];
int dfn[1001000],low[1001000],id,cnt,c[1001000],inst[1001000];
//stack<int> s;
int st[1001000],top;
void add(int u,int v){
	a[++num].v=v;
	a[num].nxt=head[u];
	head[u]=num;
}
void tarjan(int u){
	dfn[u]=low[u]=++id;
	st[++top]=u;
	inst[u]=1;
	for(int i=head[u];i;i=a[i].nxt){
		int v=a[i].v;
		if(!dfn[v]){
			tarjan(v);
			low[u]=min(low[u],low[v]);
		}else if(inst[v]){
			low[u]=min(low[u],dfn[v]);
		}
	}
	if(dfn[u]==low[u]){
		int t=0;
		cnt++;
		while(t!=u){
			t=st[top--];
			c[t]=cnt;
			inst[t]=0;
		}
	}
}
int main(){
//	ios::sync_with_stdio(false);
//	cin.tie(0);
//	cout.tie(0);
	scanf("%d%d",&n,&m);
	for(int i=1;i<=m;i++){
		int u,a,v,b;
		scanf("%d%d%d%d",&u,&a,&v,&b);
		if(a==0&&b==0){
			add(u+n,v);
			add(v+n,u);
		}
		if(a==0&&b==1){
			add(u+n,v+n);
			add(v,u);
		}
		if(a==1&&b==0){
			add(u,v);
			add(v+n,u+n);
		}
		if(a==1&&b==1){
			add(u,v+n);
			add(v,u+n);
		}
	}
	for(int i=1;i<=2*n;i++){
		if(!dfn[i]){
			tarjan(i);
		}
	}
	for(int i=1;i<=n;i++){
		if(c[i]==c[i+n]){
			printf("IMPOSSIBLE");
			return 0;
		}
	}
	printf("POSSIBLE\n");
	for(int i=1;i<=n;i++){
		printf("%d ",c[i]>c[i+n]);
	}
	return 0;
} 
2025/1/23 10:06
加载中...