Pagini recente » Cod sursa (job #1308116) | Cod sursa (job #79432) | Cod sursa (job #2171987) | Cod sursa (job #2229001) | Cod sursa (job #2229004)
#include <fstream>
#include <vector>
using namespace std;
ifstream fi("party.in");
ofstream fo("party.out");
int n,m;
int k,CLAUZE[3001][2];
int VIZ[205];
vector <int> ADJ[205];
vector <int> ADJT[205];
int S[205],kstiva;
int df(int v)
{
vector <int> :: iterator it;
VIZ[v]=1;
for (it=ADJ[v].begin();it!=ADJ[v].end();it++)
{
int varf;
varf=(*it);
if (VIZ[varf]==0)
df(varf);
}
S[++kstiva]=v;
}
int dft(int v)
{
vector <int> :: iterator it;
VIZ[v]=0;
for (it=ADJT[v].begin();it!=ADJT[v].end();it++)
{
int varf;
varf=(*it);
if (VIZ[varf]==-1 && VIZ[varf^1]==-1)
dft(varf);
}
}
int main()
{
fi>>n>>m;
for (int i=1;i<=m;i++)
{
int x,y,z;
fi>>x>>y>>z;
if (z==0)
{
/// cel putin unul dintre x si y participa la petrecere
/// x v y
k++;
CLAUZE[k][0]=x;
CLAUZE[k][1]=y;
}
if (z==1)
{
/// daca x nu participa atunci nici y nu participa
/// daca x participa, atunci y poate sa faca ce vrea
k++;
CLAUZE[k][0]=x;
CLAUZE[k][1]=-y;
}
if (z==2)
{
/// daca y nu participa atunci nici x nu participa
/// daca y participa, atunci x poate sa faca ce vrea
k++;
CLAUZE[k][0]=-x;
CLAUZE[k][1]=y;
}
if (z==3)
{
/// nu participa si x si y
k++;
CLAUZE[k][0]=-x;
CLAUZE[k][1]=-y;
}
}
/// se construieste graful de inferente
/// precum si graful transpus
for (int i=1;i<=k;i++)
{
int a, b;
int aa, bb;
a=CLAUZE[i][0];
b=CLAUZE[i][1];
if (a>0)
aa=2*a;
else
aa=2*(-a);
if (b>0)
bb=2*b;
else
bb=2*(-b);
ADJ[aa].push_back(bb^1);
ADJ[bb].push_back(aa^1);
ADJT[bb^1].push_back(aa);
ADJT[aa^1].push_back(bb);
}
/// se aplica algoritmul Kosaraju-Sharir
/// se depun varfurile 2..2n+1 intr-o stiva
kstiva=0;
for (int i=2;i<=2*n+1;i++)
if (VIZ[i]==0)
df(i);
for (int i=2;i<=2*n+1;i++)
VIZ[i]=-1;
for (int i=kstiva;i>=1;i--)
{
int v;
v=S[i];
if (VIZ[v]==-1 && VIZ[v^1]==-1)
dft(v);
}
int rez=0;
for (int i=1;i<=n;i++)
if (VIZ[i<<1]==0)
;
else
rez++;
fo<<rez<<"\n";
for (int i=1;i<=n;i++)
if (VIZ[i<<1]==0)
;
else
fo<<i<<"\n";
fi.close();
fo.close();
return 0;
}