Cod sursa(job #56559)

Utilizator gigi_becaliGigi Becali gigi_becali Data 29 aprilie 2007 21:15:51
Problema Felinare Scor 40
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.11 kb
using namespace std;
#include <cstdio>
#include <vector>
#include <string>
#include <algorithm>
#include <cstdlib>
#define maxn 9000
using namespace std;
vector<vector<int> > a;
bool viz[maxn];
int l[maxn], r[maxn];

int n, m;

void citire()
{
  int p, q;
  freopen("felinare.in", "r", stdin);
  scanf("%d %d\n", &n, &m);
  a.resize(n+1);
 

  while(m--)
    {
      scanf("%d %d\n", &p, &q);
      a[p].push_back(q);
    }
}

int pairup(int n)
{
  if(viz[n]) return 0;
  viz[n]=1;


  vector<int>::iterator i;

  for(i=a[n].begin();i!=a[n].end();++i)
    if(!l[*i] || pairup(l[*i]))
      {
	l[*i]=n;
	r[n]=*i;
	return 1;
      }
  return 0;
}

int main()
{
  time_t s; time(&s); srand(s%666013);
  citire();
  int flow=0;
  int random_order[maxn];
  for(int i=1;i<=n;i++) random_order[i]=i;
   random_shuffle(random_order+1, random_order+n+1);
   // for(int i=1;i<=n;i++) printf("%d ", random_order[i]); printf("\n");
 for(int i=1;i<=n;i++) 
   if(pairup(random_order[i])) ++flow;
   else {memset(viz, 0, sizeof(viz)); flow+=pairup(random_order[i]);}

 freopen("felinare.out", "w", stdout);
 printf("%d\n", n+n-flow);
 return 0;
}