Cod sursa(job #1134870)

Utilizator ELHoriaHoria Cretescu ELHoria Data 6 martie 2014 23:01:00
Problema Party Scor 100
Compilator cpp Status done
Runda Teme Pregatire ACM Unibuc 2013 Semestrul 2 Marime 1.79 kb
#include <fstream>
#include <bitset>
#include <vector>

using namespace std;

ifstream cin("party.in");
ofstream cout("party.out");

const int NMAX = int(1e5) + 2;
int N, M;
vector<int> G[NMAX << 1], GT[NMAX << 1], s;
bitset< NMAX << 1 > visited, truthValue;
bool solution = true;
#define non(v) (v > N ? v - N : v + N)

inline void addEdge(int a, int b) {
	G[non(a)].push_back(b);
	G[non(b)].push_back(a);
	GT[a].push_back(non(b));
	GT[b].push_back(non(a));

}

void readData(){
	cin >> N >> M;
	int a, b, t;
	for (int i = 0; i < M; i++) {
		cin >> a >> b >> t;
		if (t == 0) {
			addEdge(a, b);
		}
		else
		if (t == 1) {
			addEdge(b + N, a);
		}
		else
		if (t == 2) {
			addEdge(a + N, b);
		}
		else {
			addEdge(a + N, b + N);
		}
	}
}

void df(const int &v) {
	visited[v] = true;
	for (vector<int>::const_iterator w = G[v].begin(); w != G[v].end(); w++) {
		if (visited[*w] == false) {
			df(*w);
		}
	}
	s.push_back(v);
}

void df1(const int &v) {
	if (truthValue[v]) {
		solution = false;
	}
	truthValue[non(v)] = true;
	visited[v] = true;
	for (vector<int>::const_iterator w = GT[v].begin(); w != GT[v].end(); w++) {
		if (visited[*w] == false) {
			df1(*w);
		}
	}
}

void solve() {
	for (int i = 1; i <= (N << 1); i++){
		if (!visited[i]) {
			df(i);
		}
	}
	visited.reset();
	for (vector<int>::const_reverse_iterator it = s.rbegin(); it != s.rend(); it++) {
		if (!visited[*it] && !visited[non(*it)]) {
			df1(*it);
		}
	}
	if (solution) {
		int nr = 0;
		for (int i = 1; i <= N; i++) {
			nr += truthValue[i];
		}
		cout << nr << "\n";
		for (int i = 1; i <= N; i++) {
			if (truthValue[i]) {
				cout << i << "\n";
			}
		}
	}
	else {
		cout << "-1\n";
	}
}

int main()
{
	readData();
	solve();
	return 0;
}