Pagini recente » Cod sursa (job #2949627) | Cod sursa (job #2612049) | Cod sursa (job #1908646) | Cod sursa (job #2448000) | Cod sursa (job #681278)
Cod sursa(job #681278)
#include<cstdio>
#include<vector>
#include<bitset>
#define infile "cuplaj.in"
#define outfile "cuplaj.out"
#define n_max 20005
#define nxt *it
#define pb push_back
#define FOR(g) \
for(vector<int> :: iterator it = g.begin(); it!=g.end(); ++it)
using namespace std;
vector < int > v[n_max];
int R[n_max], L[n_max];
bitset < n_max > done;
int N, M;
int Cuplaj;
void citeste()
{
freopen(infile,"r",stdin);
int E, x, y;
scanf("%d %d %d",&N, &M, &E);
while(E--)
{
scanf("%d %d",&x,&y);
v[x].pb(y);
}
fclose(stdin);
}
int pair_up(int x)
{
if(done[x])//daca x a mai fost folosit
return 0;
done[x] = 1;//il marchez
FOR(v[x])//iau toti vecinii din dreapta( nxt )
if(!R[nxt])//daca nxt nu este cuplat
{
L[x] = nxt;//il cuplez pe x cu nxt
R[nxt] = x;//il cuplez pe nxt cu x
return 1;//am reusit sa-l cuplez pe x
}
FOR(v[x])//iau toti vecinii din dreapta( nxt ) -> nu am gasit niciun vecin necuplat
if(pair_up(nxt))//il cuplez pe nxt cu alt nod
{
L[x] = nxt;//il cuplez pe x cu nxt
R[nxt] = x;//il cuplez pe nxt cu x
return 1;//am reusit sa-l cuplez pe x
}
return 0;//x nu a putut fi cuplat
}
void rezolva()
{
for(int ok = 1; ok; )//cat timp exista modificari
{
ok = 0;
done.reset();
for(int i=1; i<=N; ++i)
if(!L[i])//daca i nu este cuplat
ok |= pair_up(i);//incerc sa-l cuplez
}
for(int i=1; i<=N; ++i)
Cuplaj += (L[i] > 0);//daca i este cuplat Cuplaj++
}
void afiseaza()
{
freopen(outfile,"w",stdout);
printf("%d\n",Cuplaj);
for(int i=1; i<=N; ++i)
if(L[i] > 0)//daca i este cuplat
printf("%d %d\n",i, L[i]);//afisez cupaljul i - L[i]
fclose(stdout);
}
int main()
{
citeste();
rezolva();
afiseaza();
return 0;
}