1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117
   | #include<bits/stdc++.h> using namespace std; int n,m; int u[4000001]; int v[4000001]; bool vis[2000001]; int d[2000001]; int nxt[2000001]; int dfn[2000001]; int low[2000001]; int tot; inline void add(int x,int y) { 	u[++tot]=x; 	v[tot]=y; 	nxt[tot]=d[x]; 	d[x]=tot; 	return ; } int cnt; int ans; int st[2000001]; int group[2000001]; int sum=0; inline void tarjan(int now) { 	low[now]=dfn[now]=++cnt; 	st[++st[0]]=now; 	vis[now]=1; 	for(int i=d[now];i;i=nxt[i]) 	{ 		if(!dfn[v[i]]) 		{ 			tarjan(v[i]); 			low[now]=min(low[now],low[v[i]]); 		} 		else 		{ 			if(vis[v[i]]) 			{ 				low[now]=min(low[now],dfn[v[i]]); 			} 		} 	} 	if(dfn[now]==low[now]) 	{ 		sum++; 		while(st[st[0]]!=now) 		{ 			vis[st[st[0]]]=0; 			group[st[st[0]]]=sum; 			st[0]--; 		} 		vis[st[st[0]]]=0; 		group[st[st[0]]]=sum; 		st[0]--; 	} } bool used[2000001]; int main() { 	cin>>n>>m; 	for(int i=1;i<=m;i++) 	{ 		int x,typex,y,typey; 		cin>>x>>typex>>y>>typey; 		add(x+n*(typex^1),y+n*typey); 		add(y+n*(typey^1),x+n*typex); 	} 	for(int i=1;i<=2*n;i++) 	{ 		if(!dfn[i]) 		{ 			tarjan(i); 		} 	} 	memset(d,0,sizeof(d)); 	tot=0; 	for(int i=1;i<=2*m;i++) 	{ 		if(group[u[i]]!=group[v[i]]) 		{ 			add(group[u[i]],group[v[i]]); 		} 	} 	for(int i=1;i<=n;i++) 	{ 		if(group[i]==group[i+n]) 		{ 			cout<<"IMPOSSIBLE"<<endl; 			return 0; 		} 	} 	cout<<"POSSIBLE"<<endl; 	for(int i=1;i<=n;i++) 	{ 		if(used[group[i]]) 		{ 			cout<<0<<" "; 		} 		else if(used[group[i+n]]) 		{ 			cout<<1<<" "; 		} 		else if(group[i]<group[i+n]) 		{ 			cout<<0<<" "; 			used[group[i]]=1; 		} 		else 		{ 			cout<<1<<" "; 			used[group[i+n]]=1; 		} 	} 	return 0; }
   |