Pagini recente » Cod sursa (job #1137040) | Cod sursa (job #1702718) | Profil sebinechita | Cod sursa (job #2741333) | Cod sursa (job #116818)
Cod sursa(job #116818)
#include <stdio.h>
#include <string.h>
#include <vector>
using namespace std;
#define get(var) (var > 0) ? (x[var]) : (!x[-var])
#define set(var) (var > 0) ? (x[var] = 1) : (x[-var] = 0)
int N, M, P[1005][2], x[1005];
int q[105], ql, qr, uz[105];
vector<int> G[105];
int check(int prop)
{
int v1 = get(P[prop][0]), v2 = get(P[prop][1]);
if (v1 == -1 && !v2)
{
set(P[prop][0]);
q[++ql] = P[prop][0];
}
else if (!v1 && v2 == -1)
{
set(P[prop][1]);
q[++ql] = P[prop][1];
}
else if (v1 == -1 && v2 == -1)
return 1;
else if (v1 != -1 && v2 != -1)
return v1 || v2;
return 1;
}
int BF(int start)
{
int ql, qr, sz, ok = 1, el, i;
for (q[ql=qr=0] = start, uz[start] = 1; qr <= ql && ok; qr++)
for (el = q[qr], sz = G[el].size(), i = 0; i < sz && ok; i++)
ok = check(G[el][i]);
for (i = 0; i <= ql; i++)
(!ok) ? (x[q[i]] = -1) : (0),
uz[q[i]] = 0,
q[i] = 0;
return ok;
}
int main(void)
{
int i, j, u, v, t;
freopen("party.in", "r", stdin);
freopen("party.out", "w", stdout);
scanf("%d %d", &N, &M);
for (i = 1; i <= M; i++)
{
scanf("%d %d %d", &u, &v, &t);
G[u].push_back(i);
G[v].push_back(i);
P[i][0] = u; P[i][1] = v;
if (t == 1)
P[i][1] *= (-1);
else if (t == 2)
P[i][0] *= (-1);
else if (t == 3)
P[i][0] *= (-1), P[i][1] *= (-1);
}
memset(x, -1, sizeof(x));
for (i = 1; i <= N; i++)
if (x[i] == -1)
{
x[i] = 0;
j = BF(i);
if (!j)
{
x[i] = 1;
j = BF(i);
}
}
for (j = 0, i = 1; i <= N; i++)
j += x[i];
printf("%d\n", j);
for (i = 1; i <= N; i++)
if (x[i])
printf("%d\n", i);
return 0;
}