Cod sursa(job #950214)

Utilizator krissu93FMI Tiugan Cristiana Elena krissu93 Data 16 mai 2013 10:20:59
Problema Cuplaj maxim in graf bipartit Scor 8
Compilator cpp Status done
Runda Arhiva educationala Marime 1.4 kb
#include <iostream>
#include <fstream>
#include <vector>
#include<algorithm>
#include <string.h>
using namespace std;



int st[10010];//nodurile din multimea stanga pt cuplaj;
int dr[10010];//nodurile din multimea dreapta pt cuplaj;
int viz[10010];
vector<int>vecini[10010];

int cuplaj(int nod)
{   int i;
   if (viz[nod]==1) return 0;
    viz[nod]=1;
    for ( i=0;i<vecini[nod].size();i++)
    {
        int a=vecini[nod][i];
        if (dr[a]==0){
            dr[a]=nod;
            st[nod]=a;
            return 1;
            }
    }
    for ( i=0;i<vecini[nod].size();i++)
    {
        int a=vecini[nod][i];
        if (cuplaj(dr[a])){
            dr[nod]=a;
            st[a]=nod;
            return 1;
        }
    }
    return 0;
}


int main()
{
    ifstream in("cuplaj.in");
    ofstream out("cuplaj.out");

    int noduri1, noduri2, muchii;
    int i, ok=1, cupl=0;

    in>>noduri1>>noduri2>>muchii;
    for (i=0;i<muchii;i++)
    {
        int nod1, nod2;
        in>>nod1>>nod2;
        vecini[nod1].push_back(nod2);
    }
   while (ok)
   {
       ok=0;
    memset(viz,0,sizeof(viz));
       for (i=1;i<=noduri1;i++)
       if (dr[i]==0)//nu e in cuplaj
            ok|=cuplaj(i);
   }
   for (i=1;i<=noduri1;i++)
    if (dr[i]>0) cupl++;
   out<<cupl<<'\n';
   for (i=1;i<=noduri1;i++)
    if (dr[i]>0) out<<i<<' '<<dr[i]<<'\n';
   return 0;
}