Cod sursa(job #990511)

Utilizator Corneliu10Dumitru Corneliu Corneliu10 Data 28 august 2013 15:21:24
Problema Party Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.38 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;
 
  
 
}