Cod sursa(job #791408)

Utilizator lily3Moldovan Liliana lily3 Data 23 septembrie 2012 23:34:57
Problema Andrei Scor 50
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.57 kb
#include<fstream>
#include<vector>
using namespace std;

int i,j,n,m,x,y,c,ord[300001],uz[300001],niv;
int comp[300001],d[300001],sol[2000001];
vector<int> a[300001],at[300001];
int nod(int x)
{
    if(x<=n)
    return x+n;
    return x-n;
}
void df1(int x)
{
   int i;
   uz[x]=1;
   for(i=0;i<a[x].size();++i)
   if(!uz[a[x][i]])
   df1(a[x][i]);
   ord[++ord[0]]=x;
}
void df2(int x)
{
    int i;
    uz[x]=0;
    comp[x]=niv;
    d[niv]=x;
    for(i=0;i<at[x].size();++i)
    if(uz[at[x][i]])
    df2(at[x][i]);
}
int main()
{
    ifstream f("andrei.in");
    ofstream g("andrei.out");
    f>>n>>m;
    for(i=1;i<=m;++i)
    {
        f>>x>>y>>c;
      if(c==0)
      {
          a[nod(x)].push_back(y);
          a[nod(y)].push_back(x);
      }
      if(c==1)
      {
          a[x].push_back(nod(y));
          a[y].push_back((nod(x)));
      }
      if(c==2)
      {
          a[x].push_back(y);
          a[y].push_back(x);
          a[nod(x)].push_back(nod(y));
          a[nod(y)].push_back(nod(x));
      }

    }
    for(i=1;i<=n*2;++i)
    for(j=0;j<a[i].size();++j)
        at[a[i][j]].push_back(i);
       for(i=1;i<=n*2;++i)
       if(!uz[i])
       df1(i);
       for(i=n*2;i>=1;--i)
       if(uz[ord[i]])
       {
           ++niv;
           df2(ord[i]);
       }
       for(i=1;i<=niv;++i)
       sol[i]=-1;
       for(i=1;i<=niv;++i)
       if(sol[i]==-1)
       {
           sol[i]=0;
           sol[comp[nod(d[i])]]=1;
       }
       for(i=1;i<=n;++i)
       g<<sol[comp[i]]<<" ";
    return 0;
}