Cod sursa(job #790176)

Utilizator visanrVisan Radu visanr Data 20 septembrie 2012 16:33:36
Problema Party Scor 50
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.8 kb
#include <cstdio>
#include <cstdlib>
#include <cmath>
#include <vector>
#include <algorithm>
using namespace std;


#define nmax 110
#define pb push_back


vector<int> G1[nmax], G2[nmax], Now, Top;
vector<vector<int> > V;
int N, M, A, B, C, D, Tip, ans[nmax], ctc[nmax];
bool Used[nmax];

int Opp(int X)
{
    if(X <= N) return X + N;
    return X - N;
}

void DFS1(int node)
{
     Used[node] = 1;
     for(vector<int> :: iterator it = G1[node].begin(); it != G1[node].end(); ++it)
                     if(!Used[*it])
                                   DFS1(*it);
     Top.pb(node);
}

void DFS2(int node, int comp)
{
     ctc[node] = comp;
     Now.pb(node);
     for(vector<int> :: iterator it = G2[node].begin(); it != G2[node].end(); ++it)
                     if(!ctc[*it])
                                  DFS2(*it, comp);
}

void Kosaraju()
{
     for(int i = 1; i <= 2 * N; i++)
             if(!Used[i])
                         DFS1(i);
     int cnt = 1;
     while(Top.size())
     {
                      if(!ctc[Top.back()])
                      {
                                         Now.clear();
                                         DFS2(Top.back(), cnt);
                                         cnt ++;
                                         V.pb(Now);
                      }
                      Top.pop_back();
     }
}


int main()
{
    freopen("party.in", "r", stdin);
    freopen("party.out", "w", stdout);
    int i;
    scanf("%i %i", &N, &M);
    for(i = 1; i <= M; i++)
    {
          scanf("%i %i %i", &A, &B, &Tip);
          if(Tip == 0)
          {
                 C = Opp(A);
                 D = Opp(B);
          }
          if(Tip == 1)
          {
                 C = Opp(A);
                 D = B;
                 B = Opp(B);
          }
          if(Tip == 2)
          {
                 C = A;
                 D = Opp(B);
                 A = Opp(A);
          }
          if(Tip == 3)
          {
                 C = A;
                 D = B;
                 A = Opp(A);
                 B = Opp(B);
          }
          G1[C].pb(B);
          G1[D].pb(A);
          G2[A].pb(D);
          G2[B].pb(C);
    }
    Kosaraju();
    for(i = 0; i < V.size(); i++)
    {
          if(!ans[i + 1]) ans[i + 1] = 2;
          for(vector<int> :: iterator it = V[i].begin(); it != V[i].end(); ++it)
                          if(!ans[ctc[Opp(*it)]])
                                                 ans[ctc[Opp(*it)]] = 3 - ans[i + 1];
    }
    int cnt = 0;
    for(i = 1; i <= N; i++)
          if(ans[ctc[i]] == 1)
                         cnt ++;
    printf("%i\n", cnt);
    for(i = 1; i <= N; i++)
          if(ans[ctc[i]] == 1)
                         printf("%i\n", i);
    return 0;
}