Cod sursa(job #2591619)

Utilizator Lazar_LaurentiuLazar Laurentiu Lazar_Laurentiu Data 30 martie 2020 20:43:12
Problema Felinare Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.41 kb
#include <iostream>
#include <fstream>
#include <vector>

#define MAX 8200

using namespace std;

int n,m,n1,n2,ans;

bool acc[MAX],ex[2*MAX];
int l[MAX],r[MAX];

vector<int> nd[MAX];

bool pairup(int nod){
  if(acc[nod])return 0;
  acc[nod]=1;
  for(auto i:nd[nod])
    if(r[i]==0){
      r[i]=nod;
      l[nod]=i;
      return 1;
    }
  for(auto i:nd[nod])
    if(pairup(r[i])){
      r[i]=nod;
      l[nod]=i;
      return 1;
    }
  return 0;
}

void cuplaj(){
  bool test;
  do{
    test=0;
    for(int i=1;i<=n;i++)acc[i]=0;
    for(int i=1;i<=n;i++)
      if(l[i]==0&&pairup(i))
        test=1;
  } while(test);

  for(int i=1;i<=n;i++)ans+=(l[i]!=0);
}

void calc(int nod){
  for(auto i:nd[nod])
    if(!ex[n+i]){
      ex[n+i]=1;
      ex[r[i]]=0;
      calc(r[i]);
    }
}

int main()
{
    ifstream f ("felinare.in");
    ofstream g ("felinare.out");
    f>>n>>m;
    for(int i=1;i<=m;i++)
      f>>n1>>n2,
      nd[n1].push_back(n2);
    cuplaj();
    g<<2*n-ans<<'\n';
    for(int i=1;i<=n;i++)
      if(l[i])ex[i]=1;
    for(int i=1;i<=n;i++)
      if(!l[i])calc(i);
//    for(int i=1;i<=2*n;i++)
//      cout<<ex[i];
    for(int i=1;i<=n;i++)
      if(ex[i]&&ex[n+i])g<<"0\n";
      else
        if((ex[i]||ex[n+i])==0)g<<"3\n";
        else
          if(ex[i])g<<"2\n";
          else g<<"1\n";
    f.close ();
    g.close ();
    return 0;
}