Cod sursa(job #233654)

Utilizator free2infiltrateNezbeda Harald free2infiltrate Data 18 decembrie 2008 20:16:31
Problema Cuplaj maxim in graf bipartit Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.32 kb
 #include <cstdio>
 #define N 10001
 #include <string>

 struct nod { int x; nod *n;};

 nod *a[N];
 int n, m, E;
 int l[N], r[N];
 bool use[N];

 inline void add(int i, int j)
 {
     nod *p=new nod;
     p->x=j;
     p->n=a[i];
     a[i]=p;
 }

 void read()
 {
     freopen("cuplaj.in","r",stdin);
     scanf("%d %d %d\n", &n, &m, &E);

     int p, q;
     while(E--)
     {
         scanf("%d %d\n", &p, &q);
         add(p,q);
     }
 }

 inline bool pairup(int n)
 {
     if(use[n]) return 0;
     use[n]=1;

     nod *i;

     for(i=a[n]; i; i=i->n)
         if(!l[i->x])
         {
             l[i->x]=n;
             r[n]=i->x;
             return 1;
         }

     for(i=a[n]; i; i=i->n)
         if(pairup(l[i->x]))
         {
             l[i->x]=n;
             r[n]=i->x;
             return 1;
         }

     return 0;
 }

 void solve()
 {

     int flow=0, ok=1,i;

     while(ok)
     {
         ok=0;
         memset(use, 0, sizeof(use));
         for(i=1;i<=n;++i)
             if(!r[i])
                 if(pairup(i)) ++flow, ok=1;
     }

     freopen("cuplaj.out","w",stdout);
     printf("%d\n", flow);
     for(i=1;i<=n;++i)
         if(r[i]) printf("%d %d\n", i, r[i]);


 }
 int main()
 {
     read();
     solve();
     return 0;
 }