Pagini recente » Cod sursa (job #879985) | Cod sursa (job #205985) | Cod sursa (job #3190138) | Cod sursa (job #3239223) | Cod sursa (job #1182266)
#include<fstream>
#include<algorithm>
#include<cstring>
#include<vector>
#include<string>
#include<queue>
#define abs(x) ((x>0)?(x):(-(x)))
#define max(a,b) ((a)>(b)?(a):(b))
#define min(a,b) ((a)<(b)?(a):(b))
#define ll long long
using namespace std;
ifstream in("2sat.in");
ofstream out("2sat.out");
const int Nmax = 200001;
vector<int> G[Nmax];
#define G (G+100000)
vector<int> Gt[Nmax];
#define Gt (Gt+100000)
int mark[Nmax];
#define mark (mark+100000)
int N,M;
int f[Nmax];
vector<int> Ctc;
int Partof[Nmax];
#define Partof (Partof+100000)
int Comp[2*Nmax],Num;
vector<int> GC[2*Nmax];
int fat[2*Nmax],Reprez[2*Nmax];
void Dfs(int x){
mark[x]=1;
for(vector<int>::iterator it=G[x].begin();it!=G[x].end();++it){
if(!mark[*it]) Dfs(*it);
}
f[++f[0]]=x;
}
void Dfst(int x){
mark[x]=2;
for(vector<int>::iterator it=Gt[x].begin();it!=Gt[x].end();++it){
if(!mark[*it]) Dfst(*it);
}
Ctc.push_back(x);
}
queue<int> q;
int main(){
in>>N>>M;
for(int i=1;i<=M;i++){
int x,y;
in>>x>>y;
G[-x].push_back(y);
G[-y].push_back(x);
Gt[y].push_back(-x);
Gt[x].push_back(-y);
}
for(int i=-N;i<=-1;i++) if(!mark[i]) Dfs(i);
for(int i=1;i<=N;i++) if(!mark[i]) Dfs(i);
for(int i=-N;i<=N;i++) mark[i]=0;
for(int i=f[0];i>=1;i--){
Ctc.clear();
if(!mark[f[i]]){
Dfst(f[i]);
for(vector<int>::iterator it=Ctc.begin();it!=Ctc.end();++it){
if(mark[-(*it)]==2){
out<<"-1\n";
return 0;
}
}
Num++;
Reprez[Num]=Ctc[0];
for(vector<int>::iterator it=Ctc.begin();it!=Ctc.end();++it){
mark[*it]=1;
Partof[*it]=Num;
}
}
}
for(int i=-N;i<=-1;i++){
for(vector<int>::iterator it=G[i].begin();it!=G[i].end();++it){
if(Partof[i]!=Partof[*it]){
GC[ Partof[i] ].push_back( Partof[*it] );
fat[Partof[*it]]++;
}
}
}
for(int i=1;i<=N;i++){
for(vector<int>::iterator it=G[i].begin();it!=G[i].end();++it){
if(Partof[i]!=Partof[*it]){
GC[ Partof[i] ].push_back( Partof[*it] );
fat[Partof[*it]]++;
}
}
}
for(int i=1;i<=Num;i++) if(!fat[i]) q.push(i);
for(int i=1;i<=Num;i++) Comp[i]=-1;
while(!q.empty()){
int x=q.front(); q.pop();
if(Comp[x]==-1){
Comp[x]=0;
Comp[Partof[-Reprez[x]]]=1;
for(vector<int>::iterator it=GC[x].begin();it!=GC[x].end();++it){
fat[*it]--;
if(!fat[*it]) q.push(*it);
}
}
}
out<<Comp[Partof[1]];
for(int i=2;i<=N;i++) out<<' '<<Comp[Partof[i]]; out<<'\n';
return 0;
}