Cod sursa(job #1937313)

Utilizator RaduMirceaAndreiRadu Mircea Andrei RaduMirceaAndrei Data 23 martie 2017 21:16:03
Problema Andrei Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.68 kb
# include <fstream>
# include <vector>
# define DIM 200010
using namespace std;
ifstream fin("andrei.in");
ofstream fout("andrei.out");
vector<int> Lista[DIM];
int Marcat[DIM],s[DIM],poz[DIM],low[DIM],sol[DIM],ctc[DIM];
int n,m,i,x,y,c,niv,u;
int rv(int x){
    if(x>=n)
        return x-n;
    return x+n;
}
void tarjan(int nc){
    niv++;
    poz[nc]=niv;
    low[nc]=niv;
    s[++u]=nc;
    Marcat[nc]=1;
    for(int i=0;i<Lista[nc].size();i++){
        int nv=Lista[nc][i];
        if(poz[nv]==0)
            tarjan(nv);
        if(Marcat[nv]==1)
            low[nc]=min(low[nc],low[nv]);
    }
    if(low[nc]==poz[nc]){
        int k=0,val=0;
        while(s[u]!=nc){
            val=sol[s[u]];
            Marcat[s[u]]=0;
            ctc[++k]=s[u];
            u--;
        }
        val=sol[s[u]];
        Marcat[s[u]]=0;
        ctc[++k]=s[u];
        u--;
        if(val==0)
            val=1;
        for(int i=1;i<=k;i++){
            sol[ctc[i]]=val;
            sol[rv(ctc[i])]=3-val;
        }
    }
}
int main () {
    fin>>n>>m;
    for(i=1;i<=m;i++){
        fin>>x>>y>>c;
        if(c==0){
            Lista[rv(x)].push_back(y);
            Lista[rv(y)].push_back(x);
            continue;
        }
        if(c==1){
            Lista[x].push_back(rv(y));
            Lista[y].push_back(rv(x));
            continue;
        }
        Lista[x].push_back(y);
        Lista[y].push_back(x);
        Lista[rv(x)].push_back(rv(y));
        Lista[rv(y)].push_back(rv(x));
    }
    for(i=1;i<=n;i++)
        if(poz[i]==0)
            tarjan(i);
    for(i=1;i<=n;i++)
        fout<<sol[i]%2<<" ";
    fout<<"\n";
    return 0;
}