Cod sursa(job #1687673)

Utilizator depevladVlad Dumitru-Popescu depevlad Data 13 aprilie 2016 00:12:56
Problema Party Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.65 kb
#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;
}