Cod sursa(job #1039162)

Utilizator RoPaulPersa Paul RoPaul Data 22 noiembrie 2013 17:11:42
Problema Cuplaj maxim in graf bipartit Scor 50
Compilator cpp Status done
Runda Arhiva educationala Marime 3.09 kb
#include <fstream>
#include <vector>
using namespace std;
ifstream fi("cuplaj.in");
ofstream fo("cuplaj.out");
int n,m,leg,i,a,b;
vector <int> AD[20005];
vector <int> :: iterator it;
int SPOUSE[20005];
int Q[20005],prim,ultim;
int P[20005];
int VIZ[20005];
int varf,vecin;
int gasit,nrm;
int SOL[20005],k;
int main()
{
       fi>>n>>m>>leg;
       for (i=1;i<=leg;i++)
       {
              fi>>a>>b;
              b=b+n;
              AD[a].push_back(b);
              AD[b].push_back(a);
       }
       for (i=1;i<=n+m;i++)
              SPOUSE[i]=0;
       while (1)
       {
              gasit=0;
              prim=1;
              ultim=0;
              for (i=1;i<=n+m;i++)
                     VIZ[i]=0;
              // varfurile fara SPOUSE din X
              for (i=1;i<=n;i++)
                     if (SPOUSE[i]==0)
                     {
                            ultim++;
                            Q[ultim]=i;
                            P[i]=0;
                            VIZ[i]=1;
                     }
              while (prim<=ultim)
              {
                     // se expandeaza Q[prim]
                     varf=Q[prim];
                     if (varf<=n)
                            for (it=AD[varf].begin();it!=AD[varf].end();it++)
                            {
                                   vecin=(*it);
                                   if (VIZ[vecin]==0 && (vecin!=SPOUSE[varf]))
                                   {
                                          ultim++;
                                          Q[ultim]=vecin;
                                          VIZ[vecin]=1;
                                          P[vecin]=varf;
                                   }
                            }
                     else
                     if (SPOUSE[varf]==0)
                     {
                            // bingo !!
                            gasit=1;
                            k=0;
                            while(varf!=0)
                            {
                                   SOL[++k]=varf;
                                   varf=P[varf];
                            }
                            for (i=1;i<=k;i=i+2)
                            {
                                   SPOUSE[SOL[i]]=SOL[i+1];
                                   SPOUSE[SOL[i+1]]=SOL[i];
                            }
                            break;
                     }
                     else
                     {
                            ultim++;
                            Q[ultim]=SPOUSE[varf];
                            VIZ[SPOUSE[varf]]=1;
                            P[SPOUSE[varf]]=varf;
                     }
                     prim++;
              }
              if (gasit==0)
                     break;
       }
       for(i=1;i<=n;i++)
            if(SPOUSE[i])
               nrm++;
        fo<<nrm<<'\n';
       for (i=1;i<=n;i++)
            if(SPOUSE[i])
              fo<<i<<' '<<SPOUSE[i]-n<<"\n";
       fi.close();
       fo.close();
       return 0;
}