Pagini recente » Cod sursa (job #2888224) | Cod sursa (job #2196148) | Cod sursa (job #2630998) | Cod sursa (job #2897649) | Cod sursa (job #535682)
Cod sursa(job #535682)
#include<cstdio>
#include<vector>
#include<queue>
using namespace std;
const int NV=20001,N=20005,INF=1000000000;
int nrp,n,m,dist[N],per[N];
vector<int> L[N];
queue<int> Q;
void read()
{
int x,y,nrm;
freopen("cuplaj.in","r",stdin);
freopen("cuplaj.out","w",stdout);
scanf("%d%d%d",&n,&m,&nrm);
for(int i=1;i<=nrm;i++)
{
scanf("%d%d",&x,&y);
L[x].push_back(n+y);
}
}
void init()
{
for(int i=1;i<=n;i++)
per[i]=NV;
for(int i=1;i<=m;i++)
per[n+i]=NV;
nrp=0;
}
bool BFS()
{
for(int i=1;i<=n;i++)
if(per[i]==NV)
dist[i]=0, Q.push(i);
else dist[i]=INF;
dist[NV]=INF;
while(!Q.empty())
{
int nod=Q.front();
Q.pop();
if(nod!=NV)
for(vector<int>::iterator it=L[nod].begin();it!=L[nod].end();it++)
if(dist[per[*it]]==INF)
{
dist[per[*it]]=dist[nod]+1;
Q.push(per[*it]);
}
}
return dist[NV]!=INF;
}
bool DFS(int nod)
{
if(nod!=NV)
{
for(vector<int>::iterator it=L[nod].begin();it!=L[nod].end();it++)
if(dist[per[*it]]==dist[nod]+1)
if(DFS(per[*it]))
{
per[*it]=nod;
per[nod]=*it;
return true;
}
dist[nod]=INF;
return false;
}
return true;
}
void karp()
{
init();
while(BFS())
{
for(int i=1;i<=n;i++)
if(per[i]==NV && DFS(i))
nrp++;
}
}
void afis()
{
printf("%d\n",nrp);
for(int i=1;i<=n;i++)
if(per[i]!=NV)
printf("%d %d\n",i,per[i]-n);
}
int main()
{
read();
karp();
afis();
return 0;
}