Pagini recente » Cod sursa (job #867003) | Cod sursa (job #1321979) | Cod sursa (job #1957328) | Cod sursa (job #2749377) | Cod sursa (job #2409090)
#include <fstream>
#include <vector>
#include <queue>
using namespace std;
ifstream fi("cuplaj.in");
ofstream fo("cuplaj.out");
int n1,n2,m;
vector <int> ADJ[20001];
int COLOR[20001];
int SPOUSE[20001];
int k;
int X[10001],Y[10001];
int P[20001],VIZ[20001];
/// returneaza 0 daca nu exista apath
/// returneaza 1 daca exista apath
/// in acest caz se obtine si X[1]Y[1]...X[k]Y[k]
int apath()
{
vector <int> :: iterator it;
for (int i=1;i<=n1+n2;i++)
VIZ[i]=P[i]=0;
queue <int> Q;
for (int i=1;i<=n1;i++)
if (COLOR[i]==0)
{
Q.push(i);
VIZ[i]=1;
}
while (!Q.empty())
{
int v;
v=Q.front();
Q.pop();
if (v<=n1)
for (it=ADJ[v].begin();it!=ADJ[v].end();it++)
{
int vecin;
vecin=(*it);
if (VIZ[vecin]==0)
if (SPOUSE[vecin]!=v)
{
P[vecin]=v;
VIZ[vecin]=1;
Q.push(vecin);
if (COLOR[vecin]==0)
{
k=0;
int c;
c=vecin;
while (c!=0)
{
k++;
X[k]=P[c];
Y[k]=c;
c=P[P[c]];
}
return 1;
}
}
}
else
{
int vecin;
vecin=SPOUSE[v];
if (VIZ[vecin]==0)
{
P[vecin]=v;
VIZ[vecin]=1;
Q.push(vecin);
}
}
}
return 0;
}
int main()
{
fi>>n1>>n2>>m;
for (int i=1;i<=m;i++)
{
int a,b;
fi>>a>>b;
b=b+n1;
ADJ[a].push_back(b);
}
/// initializare
for (int i=1;i<=n1+n2;i++)
COLOR[i]=SPOUSE[i]=0;
while (1)
{
/// se cauta un apath
int t;
t=apath();
if (t==0)
break;
COLOR[X[k]]=COLOR[Y[1]]=1;
for (int i=k;i>=1;i--)
SPOUSE[Y[i]]=X[i];
}
int rez;
rez=0;
for (int i=1;i<=n1;i++)
if (COLOR[i]==1)
rez++;
fo<<rez<<"\n";
for (int i=n1+1;i<=n1+n2;i++)
if (SPOUSE[i]!=0)
fo<<SPOUSE[i]<<" "<<i-n1<<"\n";
fi.close();
fo.close();
return 0;
}