Cod sursa(job #1388382)

Utilizator RaduGabriel2012Dinu Radu RaduGabriel2012 Data 15 martie 2015 13:51:31
Problema Party Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.38 kb
#include <iostream>
#include <fstream>
#include <vector>
using namespace std;
ifstream f("party.in");
ofstream g("party.out");
 vector <int> v[205],vt[205],gc[205];
  int n,m,add=4,k,nr,use[205],a[205],c[205],del[205],val[205],sol;

 int neg(int x)
 { if (x>n) return x-add;
   return x+add;
 }

 void DFS1(int x)
 { int i;
    use[x]=1;

    for(i=0;i<v[x].size();i++)
     if (!use[v[x][i]]) DFS1(v[x][i]);

  k++; a[k]=x;
 }

 void DFS2(int x)
 { int i;
    c[x]=nr;
    gc[nr].push_back(x);
    // cout<<x<<" "<<nr<<"\n";
    for(i=0;i<vt[x].size();i++)
      if (!c[vt[x][i]]) DFS2(vt[x][i]);
 }
int main()
{ int i,j,t,x,y;
   f>>n>>m;

    for(i=1;i<=m;i++)
    { f>>t>>x>>y;

      if (t==1) y=neg(y);
      if (t==2) x=neg(x);
      if (t==3) {x=neg(x); y=neg(y);}

        v[neg(x)].push_back(y);
        vt[y].push_back(neg(x));
        v[neg(y)].push_back(x);
        vt[x].push_back(neg(y));

    }

   for(i=1;i<=n+add;i++)
    if (!use[i]) DFS1(i);
  // for(i=1;i<=k;i++)
   // cout<<a[i]<<" ";

   for(i=k;i>=1;i--)
   if (!c[a[i]]) { nr++; DFS2(a[i]);}

   for(i=nr;i>=1;i--)
   {
      if (del[i]) continue;

      for(j=0;j<gc[i].size();j++)
      { if (gc[i][j]<=n) sol++;
         val[gc[i][j]]=1;
         del[c[gc[i][j]]]=1;
      }
   }
    g<<sol<<"\n";
    for(i=1;i<=n;i++)
     if (val[i]) g<<i<<"\n";
    return 0;
}