Cod sursa(job #945456)

Utilizator mitrutstrutMitrea Andrei Ionut mitrutstrut Data 1 mai 2013 22:30:29
Problema Secv Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.87 kb
#include <fstream>
#include <vector>
#include <algorithm>
#define nmax 128
#define non(x) ((x)<=N?(x+N):(x-N))
using namespace std;
 
vector <int> G[nmax],Gt[nmax],deque;
int N,Answer;
bool used[nmax],mark[nmax];
 
void DFS(int Nod) {
     
    used[Nod]=0;
    mark[non(Nod)]=1;
     
    for(int i=0;i<Gt[Nod].size();i++)
        if(used[Gt[Nod][i]])
            DFS(Gt[Nod][i]);
     
}
void TopologicalSort(int Nod) {
     
    used[Nod]=1;
	
    for(int i=0;i<G[Nod].size();i++)
        if(!used[G[Nod][i]])
            TopologicalSort(G[Nod][i]);
     
    deque.push_back(Nod);
     
}
void solve() {
     
    int Nod;
     
    for(Nod=1;Nod<=2*N;Nod++)
        if(!used[Nod])
            TopologicalSort(Nod);
         
    reverse(deque.begin(),deque.end());
     
    for(Nod=0;Nod<2*N;Nod++)
        if(used[deque[Nod]]&&used[non(deque[Nod])])
            DFS(deque[Nod]);
     
}
void AddEdges(int x,int y) {
     
    G[non(x)].push_back(y);
    G[non(y)].push_back(x);
         
    Gt[x].push_back(non(y));
    Gt[y].push_back(non(x));
     
}
void read() {
     
    int x,y,type,M;
    ifstream in("party.in");
    in>>N>>M;
     
    while(M--) {
         
        in>>x>>y>>type;
         
        switch(type) {
            case 0:AddEdges(x,y);break;
            case 1:AddEdges(x,non(y));break;
            case 2:AddEdges(non(x),y);break;
            case 3:AddEdges(non(x),non(y));break;
            }
         
        }
     
    in.close();
     
}
void write() {
     
    ofstream out("party.out");
     
    for(int i=1;i<=N;i++)
        Answer+=mark[i];
     
    out<<Answer<<'\n';
     
    for(int i=1;i<=N;i++)
        if(mark[i])
            out<<i<<'\n';
         
    out.close();
     
}
int main() {
     
    read();
    solve();
    write();
     
    return 0;
     
}