Pagini recente » Cod sursa (job #2913683) | Cod sursa (job #1687673)
#include <fstream>
#include <algorithm>
#include <vector>
#define pb push_back
#define neg(x) (x <= n ? x + n : x - n)
using namespace std;
ifstream in("party.in");
ofstream out("party.out");
const int N = 105;
vector<int> g[2*N], gt[2*N], lst, finSol;
bool sol[2*N], vis[2*N];
int n, m;
void firstPass(int x) {
vis[x] = 1;
for(auto y : g[x]) {
if(!vis[y]) {
firstPass(y);
}
}
lst.pb(x);
}
void secondPass(int x) {
vis[x] = 1;
sol[neg(x)] = 1;
for(auto y : gt[x]) {
if(!vis[y]) {
secondPass(y);
}
}
}
inline void addEdge(int x, int y, int t) {
if(t == 0) {
g[neg(x)].pb(y);
g[neg(y)].pb(x);
gt[y].pb(neg(x));
gt[x].pb(neg(y));
}
else if(t == 1) {
g[y].pb(x);
gt[x].pb(y);
g[neg(x)].pb(neg(y));
gt[neg(y)].pb(neg(x));
}
else if(t == 2) {
g[x].pb(y);
gt[y].pb(x);
g[neg(y)].pb(neg(x));
gt[neg(x)].pb(neg(y));
}
else {
g[x].pb(neg(y));
gt[neg(y)].pb(x);
}
}
int main() {
int i, x, y, t;
in >> n >> m;
for(i = 1; i <= m; i++) {
in >> x >> y >> t;
addEdge(x, y, t);
}
for(i = 1; i <= n; i++) {
if(!vis[i]) {
firstPass(i);
}
}
fill(vis, vis + 2*N, 0);
reverse(lst.begin(), lst.end());
for(auto i : lst) {
if(!vis[i] && !vis[neg(i)]) {
secondPass(i);
}
}
for(i = 1; i <= n; i++) {
if(sol[i]) {
finSol.pb(i);
}
}
out << finSol.size() << '\n';
for(auto i : finSol) out << i << '\n';
return 0;
}