Cod sursa(job #183066)

Utilizator mihai_floreaFlorea Mihai Alexandru mihai_florea Data 21 aprilie 2008 18:01:32
Problema Felinare Scor 8
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.24 kb
#include <cstdio>
#include <cstring>
#include <vector>
using namespace std;
const int NMAX=8200;
int n,m,f,st[NMAX],dr[2*NMAX],sin[NMAX],sout[NMAX];
char viz[NMAX],s[NMAX];
vector<int> a[NMAX];
void citeste(){
     int i,j,k;
     scanf("%d %d",&n,&m);
     for (k=1;k<=n;++k) {scanf("%d %d",&i,&j);
                         a[i].push_back(n+j);}
     }
void cup(int vf){
     vector<int>::iterator it;
     if (!viz[vf]){
      viz[vf]=1;
      for (it=a[vf].begin();it!=a[vf].end();it++)
       if (st[*it]==-1){
         st[*it]=vf;
         dr[vf]=*it;
         return;}
      for (it=a[vf].begin();it!=a[vf].end();it++){
          cup(st[*it]);
          if (dr[st[*it]]!=*it){
            st[*it]=vf;
            dr[vf]=*it;
            return;}
            }
          }
      }
void cuplaj(){
     int i;
     f=0;
     memset(dr,-1,sizeof(dr));
     for (i=1;i<=n;++i)
      if (dr[i]==-1){
         memset(viz,0,sizeof(viz));
         cup(i);
         if (dr[i]!=-1) f++;}
       else f++;
     }
void scrie(){
     printf("%d\n",2*n-f);
     }        
int main(){
    freopen("felinare.in","r",stdin);
    freopen("felinare.out","w",stdout);
    citeste();
    cuplaj();
    scrie();
    return 0;
}