Pagini recente » Cod sursa (job #382631) | Cod sursa (job #2224865) | Cod sursa (job #1332166) | Cod sursa (job #1525156) | Cod sursa (job #2877229)
#include <fstream>
#include <vector>
#include <stack>
#include <queue>
using namespace std;
ifstream f("party.in");
ofstream g("party.out");
vector <int> c[211];
int nr,fam[211];
stack <int> stk;
bool instk[211];
void ctc(int k)
{
int t;
nr++;
while(t!=k)
{
t=stk.top();
stk.pop();
c[nr].push_back(t);
fam[t]=nr;
instk[t]=0;
}
}
int index,when[211],low[211];
vector <int> v[211];
void tarjan(int k)
{
index++;
when[k]=low[k]=index;
stk.push(k);
instk[k]=1;
for(auto it=v[k].begin();it!=v[k].end();it++)
if(when[*it]==0)
{
tarjan(*it);
low[k]=min(low[k],low[*it]);
}
else
if(instk[*it]==1)
low[k]=min(low[k],low[*it]);
if(when[k]==low[k])
ctc(k);
}
queue <int> q;
int n,m,i,x,y,z,C,sol[211],S,grad[211],k,p;
int main()
{
f>>n>>m;
for(i=1;i<=m;i++)
{
f>>x>>y>>C;
if(C==1)
v[x+n].push_back(y+n);
else
if(C==2)
v[y+n].push_back(x+n);
else
if(C==3)
{
v[x].push_back(y+n);
v[y].push_back(x+n);
v[x+n].push_back(y);
v[y+n].push_back(x);
}
}
for(i=1;i<=2*n;i++)
{
sol[i]=-1;
if(fam[i]==0)
tarjan(i);
}
for(i=1;i<=2*n;i++)
for(auto it=v[i].begin();it!=v[i].end();it++)
if(fam[i]!=fam[*it])
grad[fam[*it]]++;
for(i=1;i<=nr;i++)
if(grad[i]==0)
q.push(i);
while(q.empty()==false)
{
k=q.front();
q.pop();
for(auto it=c[k].begin();it!=c[k].end();it++)
{
z=*it;
if(z>n)
z=z-n;
if(sol[z]==-1)
{
if(*it>n)
sol[z]=1;
else
sol[z]=0;
}
}
for(auto it=c[k].begin();it!=c[k].end();it++)
for(auto j=v[*it].begin();j!=v[*it].end();j++)
{
if(fam[*it]!=fam[*j])
{
grad[fam[*j]]--;
if(grad[fam[*j]]==0)
q.push(fam[*j]);
}
}
}
for(i=1;i<=n;i++)
if(sol[i]==1)
S++;
p=1;
if(S==0)
{
S=n;
p=0;
}
g<<S<<'\n';
for(i=1;i<=n;i++)
if(sol[i]==p)
g<<i<<'\n';
return 0;
}