Pagini recente » Cod sursa (job #3124879) | Cod sursa (job #100810) | Cod sursa (job #1991837) | Cod sursa (job #3257140) | Cod sursa (job #1937386)
#include <fstream>
#include <vector>
#include <bitset>
#include <stack>
#define nmax 200005
using namespace std;
class instream
{
public:
instream() {}
instream(const char *file_name) {
input_file=fopen(file_name,"r");
cursor=0;
fread(buffer,sizy,1,input_file);
}
inline instream &operator >>(int &n) {
while((buffer[cursor]<'0'||buffer[cursor]>'9')&&(buffer[cursor]!='-'))
advance();
int semn=1;
if (buffer[cursor]=='-')
semn=-semn,advance();
n=0;
while('0'<=buffer[cursor]&&buffer[cursor]<='9')
{
n=n*10+buffer[cursor]-'0';
advance();
}
n*=semn;
return *this;
}
private:
FILE *input_file;
static const int sizy=1<<16;
int cursor;
char buffer[sizy];
inline void advance() {
++ cursor;
if(cursor==sizy){
cursor=0;
fread(buffer,sizy,1,input_file);
}
}
};
instream f("2sat.in");
ofstream g("2sat.out");
vector <int> v[nmax],p[nmax];
bitset <nmax> b;
stack <int> s;
int n,m,sol[nmax];
int cod(int x)
{
if (x<0)
return n-x;
return x;
}
int opus(int x)
{
if (x<=n)
return x+n;
return x-n;
}
void dfs(int x)
{
int i,y;
b[x]=1;
for (i=0;i<v[x].size();i++) {
y=v[x][i];
if (b[y]==0)
dfs(y);
}
s.push(x);
}
void dft(int x)
{
if (sol[x]) {
sol[0]=-1;
return ;
}
int i,y;
sol[opus(x)]=1;
b[x]=0;
for (i=0;i<p[x].size();i++) {
y=p[x][i];
if (b[y]==1)
dft(y);
}
}
void implic(int x,int y)
{
v[cod(x)].push_back(cod(y));
p[cod(y)].push_back(cod(x));
}
int main()
{
int i,j,x,y;
f>>n>>m;
for (i=1;i<=m;i++) {
f>>x>>y;
implic(-x,y);
implic(-y,x);
}
for (i=1;i<=2*n;i++)
if (b[i]==0)
dfs(i);
while (!s.empty()) {
i=s.top();
s.pop();
if (b[i]==1&&b[opus(i)]==1)
dft(i);
}
if (sol[0]==-1) {
g<<-1<<'\n';
return 0;
}
for (i=1;i<=n;i++)
g<<sol[i]<<' ';
return 0;
}