10pts求调
查看原帖
10pts求调
929151
xxr___楼主2024/12/7 19:10
#include<bits/stdc++.h>
using namespace std;
#define up(i,l,r) for(int i=l;i<=r;++i)
#define dn(i,l,r) for(int i=l;i>=r;--i)
const int N=2e6+5;
vector<int> e[N];
int scc[N],cnt=0,idx=0,dfn[N],low[N],sta[N],top=0,n,m; 
bool in[N];
inline void dfs(int u){
	in[u]=1;dfn[u]=low[u]=++idx;sta[++top]=u;
	for(auto it:e[u]){
		if(!dfn[it]){
			dfs(it);low[u]=min(low[u],low[it]);
		}else if(in[it]){
			low[u]=min(low[u],dfn[it]);
		}
	}
	if(dfn[u]==low[u]){
		++cnt;
		while(sta[top]!=u){
			scc[sta[top]]=cnt;
			in[sta[top]]=0;
			--top;
		}
		scc[u]=cnt;in[u]=0;--top;
	}
}
int main(){
	ios::sync_with_stdio(false);
	cin.tie(nullptr);
	cout.tie(nullptr);
	cin>>n>>m;
	up(i,1,m){
		int u,a,v,b;
		cin>>u>>a>>v>>b;
		e[u+a*n].push_back(v+(b^1)*n);
		e[u+(a^1)*n].push_back(v+b*n);
	}
	up(i,1,n<<1) if(!dfn[i]) dfs(i);
	up(i,1,n<<1){
		if(i<=n&&scc[i]==scc[i+n]){
			cout<<"IMPOSSIBLE";return 0;
		}
	} 
	cout<<"POSSIBLE\n";
	up(i,1,n){
		cout<<(scc[i]>scc[i+n])<<' ';
	}
	return 0;
}
//tomxi
2024/12/7 19:10
加载中...