Cod sursa(job #1015995)

Utilizator ELHoriaHoria Cretescu ELHoria Data 25 octombrie 2013 15:48:36
Problema Party Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.91 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;
}