Cod sursa(job #1825680)

Utilizator PopoviciRobertPopovici Robert PopoviciRobert Data 9 decembrie 2016 15:57:11
Problema Cuplaj maxim in graf bipartit Scor 80
Compilator cpp Status done
Runda Arhiva educationala Marime 1.2 kb
#include <cstdio>
#include <cstring>
#include <vector>
#define MAXN 10010
std::vector <int> G[MAXN+2];
inline void add_Edge(int x,int y){
   G[x].push_back(y);
}
int v[2*MAXN+1];
bool viz[2*MAXN+1];
bool cauta(int nod){
   int x;
   for(auto x:G[nod])
     if(v[x]==0){
       v[x]=nod;
       v[nod]=x;
       return 1;
     }
   viz[nod]=1;
   for(auto x:G[nod])
     if(viz[v[x]]==0&&cauta(v[x])){
          v[x]=nod;
          v[nod]=x;
          return 1;
     }
   return 0;
}
int main(){
    FILE*fi,*fout;
    int i,n,m,e,x,y,flag,ans;
    fi=fopen("cuplaj.in" ,"r");
    fout=fopen("cuplaj.out" ,"w");
    fscanf(fi,"%d %d %d " ,&n,&m,&e);
    for(i=1;i<=e;i++){
        fscanf(fi,"%d %d " ,&x,&y);
        y+=n;
        add_Edge(x,y);
        add_Edge(y,x);
    }
    flag=1;
    while(flag){
        flag=0;
        memset(viz,0,sizeof(viz));
        for(i=1;i<=n;i++)
          if(v[i]==0)
            flag|=cauta(i);
    }
    ans=0;
    for(i=1;i<=n;i++)
      if(v[i]>0)
         ans++;
    fprintf(fout,"%d\n" ,ans);
    for(i=1;i<=n;i++)
      if(v[i]>0)
        fprintf(fout,"%d %d\n" ,i,v[i]-n);
    fclose(fi);
    fclose(fout);
    return 0;
}