Cod sursa(job #847226)

Utilizator stoicatheoFlirk Navok stoicatheo Data 3 ianuarie 2013 16:35:32
Problema Andrei Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.78 kb
#include <fstream>
#include <vector>
 
using namespace std;
 
const char InFile[]="andrei.in";
const char OutFile[]="andrei.out";
const int MaxN=200111;
 
ifstream fin(InFile);
ofstream fout(OutFile);
 
int N,M,x,y,op,S[MaxN],SOL[MaxN];
char viz[MaxN];
vector<int> G[MaxN],GT[MaxN];
 
inline int NON(const int &x)
{
    if(x>N)
    {
        return x-N;
    }
    return x+N;
}
 
inline void Add(const int &x, const int &y)
{
    G[NON(x)].push_back(y);
    G[NON(y)].push_back(x);
     
    GT[y].push_back(NON(x));
    GT[x].push_back(NON(y));
}
 
void DFP(int nod)
{
    viz[nod]=1;
    for(vector<int>::iterator it=G[nod].begin();it!=G[nod].end();++it)
    {
        if(!viz[*it])
        {
            DFP(*it);
        }
    }
    S[++S[0]]=nod;
}
 
void DFM(int nod)
{
    viz[nod]=0;
    viz[NON(nod)]=0;
     
    SOL[nod]=0;
    SOL[NON(nod)]=1;
     
    for(vector<int>::iterator it=GT[nod].begin();it!=GT[nod].end();++it)
    {
        if(viz[*it])
        {
            DFM(*it);
        }
    }
}
 
int main()
{
    fin>>N>>M;
    for(register int i=1;i<=M;++i)
    {
        fin>>x>>y>>op;
        if(op==0)
        {
            Add(x,y);
        }
        else if(op==1)
        {
            Add(NON(x),NON(y));
        }
        else
        {
            Add(x,NON(y));
            Add(NON(x),y);
        }
    }
    fin.close();
     
    for(register int i=1;i<=(N<<1);++i)
    {
        if(!viz[i])
        {
            DFP(i);
        }
    }
     
    while(S[0])
    {
        int x=S[S[0]];
        if(viz[x])
        {
            DFM(x);
        }
        --S[0];
    }
     
    for(register int i=1;i<=N;++i)
    {
        fout<<SOL[i]<<" ";
    }
    fout.close();
    return 0;
}