Cod sursa(job #642880)

Utilizator Tucu94Andrei Tuculanu Tucu94 Data 2 decembrie 2011 14:59:40
Problema Party Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.59 kb
#include <cstdio>
#include <vector>

#define NMAX 210
using namespace std;


vector<int> v[NMAX];
vector<int> vComp[NMAX];

int comp[NMAX], stiva[NMAX], nivmin[NMAX], niv[NMAX], viz[NMAX], t[NMAX], val[NMAX], nInv;

#define v (v + N)
#define comp (comp + N)
#define nivmin (nivmin + N)
#define niv (niv + N)
#define viz (viz + N)

int N, M;
int ncomp, stivaLast = -1, ult = -1;

void sortareTopologica(int i)
{
     int j;
     viz[i] = 1;
     for(j = 0; j < vComp[i].size(); ++j)
           if(!viz[ vComp[i][j] ]) sortareTopologica( vComp[i][j] );
     t[i] = ++ult;
}

void comp_tare(int i)
{
     int j;
     viz[i] = 1;
     stiva[++stivaLast] = i;     
     for(j = 0; j < v[i].size(); ++j)
         if(!viz[ v[i][j] ])
         {
             niv[ v[i][j] ] = nivmin[ v[i][j] ]= niv[i] + 1;
             comp_tare(v[i][j]);      
             if(nivmin[ v[i][j] ] < nivmin[i]) nivmin[i] = nivmin[ v[i][j] ];
         }
         else if(niv[ v[i][j] ] < nivmin[i]) nivmin[i] = niv[ v[i][j] ];
     if(niv[i] == nivmin[i])
     {
         comp[i] = ++ncomp;
         for(j = stivaLast; j >= 0 && stiva[j] != i; --j)
             comp[stiva[j]] = ncomp;
         stivaLast = j - 1;
     }
}
void add(int x, int y, int t)
{
     if(t == 0)
     {
         v[-x].push_back(y);
         v[-y].push_back(x);
     }
     else if(t == 1) v[-x].push_back(-y);
     else if(t == 2) v[-y].push_back(-x);
     else if(t == 3) 
     {
          v[x].push_back(-y);
          v[y].push_back(-x);
     }
}

int main()
{
    int i, j, x, y, tt;
    
    freopen("party.in", "r", stdin);
    freopen("party.out", "w", stdout);
    
    scanf("%d %d", &N, &M);
    for(i = 1; i <= M; ++i)
    {
        scanf("%d %d %d", &x, &y, &tt);
        add(x, y, tt);
    }
    
    for(i = -N; i <= N; ++i)
          if(i == 0) continue;
          else if(!viz[i])
          {
              niv[i] = nivmin[i] = 1;
              comp_tare(i);
          }

    for(i = -N; i <= N; ++i)
          if(i == 0) continue;
          else for(j = 0; j < v[i].size(); ++j)
               if(comp[i] != comp[ v[i][j] ])
                   vComp[ comp[i] ].push_back(comp[ v[i][j] ]);
    
    for(i = 1; i <= ncomp; ++i) viz[i] = 0;
    for(i = 1; i <= ncomp; ++i)
          if(!viz[i])    sortareTopologica(i);
          
    for(i = 1; i <= N; ++i)
    {
          if(t[ comp[i] ] < t[ comp[-i] ])  val[i] = 1, ++nInv;
          else val[i] = 0;
    }
    printf("%d\n", nInv);
    for(i = 1; i <= N; ++i)
          if(val[i]) printf("%d\n", i);         
    return 0;
    
}