Pagini recente » Cod sursa (job #1303390) | Cod sursa (job #2642244) | Cod sursa (job #1532932) | Cod sursa (job #1878814) | Cod sursa (job #2316559)
#include <bits/stdc++.h>
using namespace std;
ifstream f("party.in");
ofstream g("party.out");
int n,m,x,y,z,i,j,k,stat[210],nut[210],niv[210],up[210],comp[210],statc[210],intr[210];
vector<int> u[210],v[210];
vector<vector<int> > C;
bitset<210> viz,in;
stack<int> St;
queue<int> Q;
void dfs(int poz)
{
if(viz[poz])return ;
viz[poz]=1;
St.push(poz);in[poz]=1;
for(auto it:v[poz])
if(!viz[it])
{
up[it]=niv[it]=++k;
dfs(it);
up[poz]=min(up[poz],up[it]);
}
else
if(in[it])
up[poz]=min(up[poz],niv[it]);
if(up[poz]==niv[poz])
{
vector<int> c;
while(St.top()!=poz)
{
in[St.top()]=0;
c.push_back(St.top());
St.pop();
}
St.pop();
in[poz]=0;
c.push_back(poz);
C.push_back(c);
}
}
int main()
{
f>>n>>m;
for(i=1;i<=n;i++)
nut[i]=i+n,nut[i+n]=i;
for(;m;m--)
{
f>>x>>y>>z;
if(!z)
v[nut[x]].push_back(y),
v[nut[y]].push_back(x);
if(z==1)
v[nut[x]].push_back(nut[y]);
if(z==2)
v[nut[y]].push_back(nut[x]);
if(z==3)
v[x].push_back(nut[y]),
v[y].push_back(nut[x]);
}
// for(i=1;i<=2*n;i++)
// {
// g<<i<<": ";
// for(auto it:v[i])
// g<<it<<' ';
// g<<'\n';
// }g<<'\n';
for(i=1;i<=2*n;i++)
if(!viz[i])
{
niv[i]=up[i]=++k;
dfs(i);
}
// for(auto it:C)
// {
// for(auto that:it)
// g<<that<<' ';
// g<<'\n';
// }g<<'\n';
for(i=0;i<C.size();i++)
for(auto it:C[i])
comp[it]=i;
for(i=0;i<C.size();i++)
{
viz.reset();
for(auto it:C[i])
for(auto that:v[i])
if(!viz[comp[that]])
u[i].push_back(comp[that]),viz[comp[that]]=1,intr[comp[that]]++;
}
// for(i=0;i<C.size();i++)
// cout<<i<<" : "<<C[i][0]<<' '<<intr[i]<<'\n';
for(i=0;i<C.size();i++)
if(!intr[i])
Q.push(i);
for(i=1;i<=2*n;i++)stat[i]=statc[i]=-1;
while(Q.size())
{
i=Q.front();Q.pop();
// cout<<i<<' ';
for(auto it:u[i])
{
intr[it]--;
if(!intr[it])
Q.push(it);
}
for(auto it:C[i])
if(stat[it]!=-1)
{
statc[i]=stat[it];
break;
}
if(statc[i]==-1)
statc[i]=0;
for(auto it:C[i])
stat[it]=statc[i],stat[nut[it]]=1-statc[i];
if(statc[i])
for(auto it:u[i])
statc[it]=1;
// for(i=1;i<=2*n;i++)
// g<<i<<' '<<stat[i]<<'\n';g<<'\n';
}
int ans=0;
for(i=1;i<=n;i++)
if(stat[i])
ans++;
g<<ans<<'\n';
for(i=1;i<=n;i++)
if(stat[i])
g<<i<<'\n';
return 0;
}