Pagini recente » Cod sursa (job #2752148) | Cod sursa (job #1703604) | Cod sursa (job #1753870) | Cod sursa (job #1165013) | Cod sursa (job #371812)
Cod sursa(job #371812)
#include <cstdio>
#include <algorithm>
#define MAXN 100100
#define MAXM 100100
using namespace std;
int N, M;
pair <int, int> EXPR[MAXM];
int STACK[MAXN], SOL[MAXN];
bool found_sol;
bool eval_term(pair <int, int> T) {
int x, y;
x = STACK[abs(T.first)];
y = STACK[abs(T.second)];
if (T.first < 0)
x ^= 1;
if (T.second < 0)
y ^= 1;
return (x | y);
}
bool check_solution() {
int i;
for (i = 1; i <= M; i++)
if (!eval_term(EXPR[i]))
return false;
return true;
}
void generate_solution(int K) {
int i, bit;
if (found_sol)
return;
if (K == N) {
if (check_solution() == true) {
for (i = 1; i <= N; i++)
SOL[i] = STACK[i];
found_sol = true;
}
}
else {
for (bit = 0; bit < 2; bit++) {
STACK[K + 1] = bit;
generate_solution(K + 1);
}
}
}
void read() {
int i, a, b, c;
scanf("%d%d", &N, &M);
for (i = 1; i <= M; i++) {
scanf("%d%d%d", &a, &b, &c);
if (c == 0)
EXPR[i] = make_pair(a, b);
if (c == 1)
EXPR[i] = make_pair(a, -b);
if (c == 2)
EXPR[i] = make_pair(-a, b);
if (c == 3)
EXPR[i] = make_pair(-a, -b);
}
}
void afis() {
int i, rez = 0;
for (i = 1; i <= N; i++)
rez += SOL[i];
printf("%d\n", rez);
for (i = 1; i <= N; i++)
if (SOL[i] == 1)
printf("%d\n", i);
}
int main(){
int i;
freopen("party.in", "r", stdin);
freopen("party.out", "w", stdout);
read();
/* scanf("%d%d", &N, &M);
for (i = 1; i <= M; i++) {
scanf("%d%d", &a, &b);
EXPR[i] = make_pair(a, b);
}*/
found_sol = false;
generate_solution(0);
if (!found_sol)
printf("-1\n");
else {
afis();
/* for (i = 1; i <= N; i++)
printf("%d ", SOL[i]); */
}
return 0;
}