Pagini recente » Cod sursa (job #1115889) | Cod sursa (job #3142431) | Cod sursa (job #1545907) | Cod sursa (job #1231280) | Cod sursa (job #2791918)
#include <bits/stdc++.h>
using namespace std;
ifstream fin("party.in");
ofstream fout("party.out");
const int NMAX = 1005;
int n,m,x,y,rasp[2*NMAX],low[2*NMAX],nivel[2*NMAX],k,z;
bool ver[2*NMAX],NU_EXISTA;
vector <int> v[2*NMAX];
stack <int> q;
set <int> s;
int opus(int node){
if(node<0) return -node;
if(node<NMAX) return node+NMAX;
return node-NMAX;
}
void dfs(int node){
q.push(node);
ver[node]=true;
low[node]=nivel[node]=++k;
for(int i=0;i<v[node].size();i++){
int vecin=v[node][i];
if(nivel[vecin]==0){
dfs(vecin);
if(low[vecin]<low[node])
low[node]=low[vecin];
} else if(ver[vecin]!=0){
if(nivel[vecin]<low[node])
low[node]=nivel[vecin];
}
}
if(nivel[node]==low[node]){
s.clear();
int n2=0;
while(n2!=node){
n2=q.top();
q.pop();
ver[n2]=false;
s.insert(n2);
if(rasp[n2]==0){
rasp[n2]=1;
rasp[opus(n2)]=-1;
}
}
}
}
int nod_(int node){
if(node<0) return NMAX-node;
return node;
}
void add_(int x,int y){
x=nod_(x);
y=nod_(y);
v[x].push_back(y);
}
void citire(){
fin >> n >> m;
for(int i=1;i<=m;i++){
fin >> x >> y >> z;
if(z==1){ y=-y; }
if(z==2){ x=-x; }
if(z==3){ x=-x,y=-y; }
add_(-x,y);
add_(-y,x);
}
}
void solve(){
for(int i=1;i<=n;i++){
if(nivel[i]==0) dfs(i);
}
for(int i=1;i<=n;i++){
if(nivel[i+NMAX]==0) dfs(i+NMAX);
}
}
void afis(){
int rasp_dim=0;
for(int i=1;i<=n;i++){
if(rasp[i]==1) rasp_dim++;
}
fout << rasp_dim << '\n';
for(int i=1;i<=n;i++){
if(rasp[i]==1) fout << i << '\n';
}
}
int main()
{
citire();
solve();
afis();
return 0;
}