Cod sursa(job #699606)

Utilizator flaviu.stefanlupu flaviu flaviu.stefan Data 29 februarie 2012 20:27:25
Problema Party Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.31 kb
//Party - infoarena

//2 SAT

 

#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;

 

}