Cod sursa(job #1268091)

Utilizator RaduGabriel2012Dinu Radu RaduGabriel2012 Data 20 noiembrie 2014 16:49:43
Problema Felinare Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.51 kb
#include <iostream>
#include <fstream>
#include <cstring>
#include <vector>
using namespace std;
ifstream f("felinare.in");
ofstream g("felinare.out");

vector <int> v[17005];
int n,m,use[17005],l[17005],r[17005],was[17005],sol,is[17005],gr[17005];

int DFS(int x)
{ int i,nod;
     if (use[x]) return 0;
      use[x]=1;

    for(i=0;i<v[x].size();i++)
    { nod=v[x][i];
       if (!r[nod])
       { l[x]=nod;
         r[nod]=x;
        return 1;
       }
    }

    for(i=0;i<v[x].size();i++)
    { nod=v[x][i];
        if (DFS(r[nod]))
        { l[x]=nod;
          r[nod]=x;
          return 1;
        }
    }

 return 0;
}
 void Suport(int x)
 { int i;
    for(i=0;i<v[x].size();i++)
     if (!is[v[x][i]])
     {
         is[v[x][i]]=1;
         is[r[v[x][i]]]=0;
        Suport(r[v[x][i]]);
     }
 }
int main()
{ int i,x,y,ok;
  f>>n>>m;

  for(i=1;i<=m;i++)
  { f>>x>>y;
     v[n+x].push_back(y);
  }

  ok=1;

  while(ok)
  { memset(use,0,sizeof(use));
    ok=0;
    for(i=n+1;i<=2*n;i++)
     if (!l[i] && DFS(i)) ok=1;
  }

    for(i=n+1;i<=2*n;i++)
     if (l[i]) is[i]=1;

    for(i=1;i<=2*n;i++)
     if (!l[i]) Suport(i);

   for(i=1;i<=2*n;i++)
   { is[i]^=1;
     if (is[i]) sol++;
   }
     g<<sol<<"\n";

     for(i=1;i<=n;i++)
     {
        if (is[i] && is[n+i]) g<<"3"<<"\n";
        if (is[i] && !is[n+i]) g<<"2"<<"\n";
        if (!is[i] && is[n+i]) g<<"1"<<"\n";
        if (!is[i] && !is[n+i]) g<<"0"<<"\n";
     }

    return 0;
}