Pagini recente » Cod sursa (job #2122739) | Cod sursa (job #398227) | Cod sursa (job #928569) | Cod sursa (job #88276) | Cod sursa (job #467334)
Cod sursa(job #467334)
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <vector>
using namespace std;
#define MAX_N 100010
vector <int> G[MAX_N], col[MAX_N];
vector <int> comp[MAX_N];
int n, m, k;
int use[MAX_N], find[MAX_N], sol[MAX_N], bad[MAX_N];
int violet[MAX_N], sir[MAX_N], use_sir[MAX_N];
void dfs(int nod) {
if (use[nod])
return;
else
use[nod] = 1;
comp[k].push_back(nod);
find[nod] = k;
int len = G[nod].size();
for (int i = 0; i < len; i++)
if (col[nod][i] == 2)
dfs(G[nod][i]);
}
void dfs_comp(int comp, int nod) {
if (use[nod])
return;
else {
use[nod] = 1;
int len = G[nod].size();
for (int i = 0; i < len; i++)
if (find[G[nod][i]] == find[nod]) {
sol[G[nod][i]] = 1 - sol[nod];
dfs_comp(find[G[nod][i]], G[nod][i]);
}
}
}
int main() {
freopen("andrei.in", "r", stdin);
freopen("andrei.out", "w", stdout);
scanf("%d %d", &n, &m);
for (int i = 1; i <= m; i++) {
int a, b, c;
scanf("%d %d %d", &a, &b, &c);
G[a].push_back(b); G[b].push_back(a);
col[a].push_back(c); col[b].push_back(c);
if (c == 2)
violet[a] = violet[b] = 1;
}
for (int i = 1; i <= n; i++)
if (!use[i] && violet[i] == 1) {
k++;
dfs(i);
}
srand(time(0));
for (int i = 1; i <= n; i++)
if (find[i] == 0 || (find[i] > 0 && i == comp[find[i]][0]))
sir[++sir[0]] = i;
for (int i = 1; i <= sir[0]; i++)
sol[sir[i]] = rand() % 2;
while (true) {
bad[0] = 0;
for (int i = 1; i <= sir[0]; i++) {
int nod = sir[i];
if (find[nod])
for (vector<int>::iterator it = comp[find[nod]].begin(); it != comp[find[nod]].end(); ++it)
use[*it] = 0;
}
for (int i = 1; i <= sir[0]; i++) {
int nod = sir[i];
if (find[nod])
dfs_comp(find[nod], nod);
}
for (int i = 1; i <= sir[0]; i++) {
int fiu = sir[i];
int len = G[fiu].size();
for (int j = 0; j < len; j++) {
if (col[fiu][j] == 0 && sol[fiu] == 0 && sol[G[fiu][j]] == 0) {
bad[++bad[0]] = sir[i];
break;
}
if (col[fiu][j] == 1 && sol[fiu] == 1 && sol[G[fiu][j]] == 1) {
bad[++bad[0]] = sir[i];
break;
}
if (col[fiu][j] == 2 && sol[fiu] == sol[G[fiu][j]]) {
bad[++bad[0]] = sir[i];
break;
}
}
}
if (bad[0] == 0)
break;
else {
int poz = rand() % bad[0] + 1;
sol[poz] = 1 - sol[poz];
}
}
for (int i = 1; i <= n; i++)
printf("%d ", sol[i]);
printf("\n");
return 0;
}