Nu aveti permisiuni pentru a descarca fisierul grader_test3.in
Cod sursa(job #2289968)
Utilizator | Data | 25 noiembrie 2018 16:28:22 | |
---|---|---|---|
Problema | 2SAT | Scor | 50 |
Compilator | cpp-64 | Status | done |
Runda | Arhiva educationala | Marime | 1.69 kb |
#include <bits/stdc++.h>
#define N 100010
#define N2 (N*2)
#define g (graf+N)
#define comp (componenta+N)
#define val (valori+N)
#define niv (nivel+N)
#define low (loww+N)
#define inst (instt+N)
using namespace std;
int n, m;
vector<int> graf[N2];
int st[N2];
int lst;
int componenta[N2];
int valori[N2];
int nivel[N2];
int loww[N2];
int instt[N2];
int ind;
int nrcomp = 0;
void dfs(int nod)
{
st[lst++] = nod;
niv[nod] = ++ind;
low[nod] = niv[nod];
inst[nod] = 1;
for(auto next : g[nod])
{
if(niv[next] == 0)
{
dfs(next);
low[nod] = min(low[nod], low[next]);
}
else if(inst[next])
low[nod] = min(low[nod], low[next]);
}
if(niv[nod] == low[nod])
{
st[lst] = -1;
while(st[lst] != nod)
{
comp[st[lst - 1]] = nrcomp;
inst[st[lst - 1]] = 0;
lst--;
}
nrcomp++;
}
}
int main()
{
freopen("2sat.in", "r", stdin);
freopen("2sat.out", "w", stdout);
scanf("%d%d", &n, &m);
for(int i = 0; i < m; i++)
{
int a, b;
scanf("%d%d", &a, &b);
g[-a].push_back(b);
g[-b].push_back(a);
}
for(int i = -n; i <= n; i++)
{
if(i == 0) continue;
val[i] = -1;
if(niv[i] == 0)
dfs(i);
}
for(int i = 1; i <= n; i++)
{
if(comp[i] == comp[-i])
{
printf("-1");
return 0;
}
}
for(int i = 1; i <= n; i++)
val[i] = comp[i] < comp[-i] ? 1 : 0;
for(int i = 1; i <= n; i++)
printf("%d ", val[i]);
return 0;
}