Pagini recente » Cod sursa (job #2544051) | Cod sursa (job #2821947) | Cod sursa (job #2565605) | Cod sursa (job #168393) | Cod sursa (job #950219)
Cod sursa(job #950219)
#include <iostream>
#include <fstream>
#include <vector>
#include<algorithm>
#include <string.h>
using namespace std;
int noduri1, noduri2, muchii;
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];
void init()
{
for (int i=0;i<noduri1;i++) viz[i]=0;
}
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[a]=nod;
st[nod]=a;
return 1;
}
}
return 0;
}
int main()
{
ifstream in("cuplaj.in");
ofstream out("cuplaj.out");
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);
}
for(ok=1;ok; )
{
ok=0;
init();
for (i=1;i<=noduri1;i++)
if (st[i]==0)//nu e in cuplaj
ok|=cuplaj(i);
}
for (i=1;i<=noduri1;i++)
if (st[i]>0) cupl++;
out<<cupl<<'\n';
for (i=1;i<=noduri1;i++)
if (st[i]>0) out<<i<<' '<<st[i]<<'\n';
return 0;
}