Pagini recente » Cod sursa (job #3182005) | Cod sursa (job #1143435) | Cod sursa (job #2846227) | Cod sursa (job #2867419) | Cod sursa (job #630202)
Cod sursa(job #630202)
//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;
}