Cod sursa(job #253363)

Utilizator floringh06Florin Ghesu floringh06 Data 5 februarie 2009 18:25:47
Problema Cuplaj maxim in graf bipartit Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.96 kb
 #include <cstdio>  
 #include <cstring>  
   
 using namespace std;  
   
 #define FIN "cuplaj.in"  
 #define FOUT "cuplaj.out"  
 #define MAX_N 10005  
   
 typedef struct NOD  
 {  
     int nod;  
     NOD *next;  
 };  
   
 NOD *A[MAX_N];  
 int dest[MAX_N];  
 int p[MAX_N];  
 int v[MAX_N];  
   
 int N, M, e;  
 int cnt;  
   
     int pairup (int nod)  
     {  
         v[nod] = 1;  
         for (NOD *q = A[nod]; q != NULL; q = q->next)  
             if (!dest[q->nod])  
             {  
                 dest[q->nod] = nod;  
                 p[nod] = q->nod;  
                 return 1;  
             }  
         for (NOD *q = A[nod]; q != NULL; q = q->next)  
             if (!v[dest[q->nod]])  
                     if (pairup(dest[q->nod]))  
                 {  
                     dest[q->nod] = nod;  
                     p[nod] = q->nod;  
                     return 1;  
                 }  
         return 0;  
     }  
   
     void cuplaj ()  
     {  
         int ok, i;  
         ok = 1;  
         while (ok)  
         {  
             ok = 0;  
             memset (v, 0, sizeof (v));  
             for (i = 1; i <= N; ++i)  
                 if (!p[i])    
                 if (pairup (i))  
                 {  
                     ok = 1;  
                     ++cnt;  
                 }  
         }  
   
         printf ("%d\n", cnt);  
         for (i = 1; i <= N; ++i)  
             if (p[i]) printf ("%d %d\n", i, p[i]);  
     }  
   
     int main ()  
     {  
         int i, a, b;  
   
         freopen (FIN, "r", stdin);  
         freopen (FOUT, "w", stdout);  
   
         scanf ("%d %d %d", &N, &M, &e);  
         for (i = 1; i <= e; ++i)  
         {  
             scanf ("%d %d", &a, &b);  
             NOD *q = new (NOD);  
             q->nod = b, q->next = A[a], A[a] = q;   
         }  
   
         cuplaj ();  
         return 0;  
     }