Cod sursa(job #1828788)

Utilizator GandalfTheWhiteGandalf the White GandalfTheWhite Data 13 decembrie 2016 21:14:19
Problema Cuplaj maxim in graf bipartit Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.16 kb
#include <cstdio>
#include <vector>
#include <cstring>
#define N 10005
using namespace std;
int n,m,p1[N],p2[N],e,nr;
bool viz[N];
vector <int> g[N];
void read()
{
int x,y;
freopen("cuplaj.in","r",stdin);
scanf("%d%d%d",&n,&m,&e);
while (e--)
   {
   scanf("%d%d",&x,&y);
   g[x].push_back(y);

   }
}
bool cuplaj(int k)
{
vector <int>::iterator it;
if (viz[k]) return 0;
viz[k]=1;
for (it=g[k].begin();it!=g[k].end();++it)
    if (p2[*it]==0) {
                    p2[*it]=k;
                    p1[k]=*it;
                    return 1;
                    }
for (it=g[k].begin();it!=g[k].end();++it)
    if (cuplaj(p2[*it])) {
                         p2[*it]=k;
                         p1[k]=*it;
                         return 1;
                         }
return 0;
}
void write()
{
int i;
freopen("cuplaj.out","w",stdout);
for (i=1;i<=n;++i)
if (p1[i]) ++nr;

printf("%d\n",nr);
for (i=1;i<=n;++i)
if (p1[i]) printf("%d %d\n",i,p1[i]);
}
int main()
{
int modif=1,i;
read();
while (modif)
   {
   modif=0;
   memset(viz,0,sizeof(viz));

   for (i=1;i<=n;++i)
       if (!p1[i]) modif+=cuplaj(i);
   }

write();
}