Pagini recente » Cod sursa (job #950626) | Cod sursa (job #896272) | Cod sursa (job #2824411) | Cod sursa (job #951394) | Cod sursa (job #2636561)
#include<bits/stdc++.h>
using namespace std;
const int NMAX=10005;
const int INF=2000000000;
vector<int> graph[NMAX];
int isPairedU[NMAX],isPairedV[NMAX];
int dmin[NMAX],nrm,n,m,e;
void citire(){
scanf("%d%d%d", &n, &m, &e);
for(int i=1;i<=e;i++){
int x,y;
scanf("%d%d", &x, &y);
graph[x].push_back(y);
}
}
bool BFS(){
queue<int> Q; ///in Q - noduri nevizitate din U
for(int i=1;i<=n;i++)
if(!isPairedU[i]){/// daca nodul i nu este cuplat cu niciun nod din U
Q.push(i);
dmin[i]=0;
}
else
dmin[i]=INF;
dmin[0]=INF;
while(!Q.empty()){
int top=Q.front();
Q.pop();
if(dmin[top]<dmin[0]){
for(auto vecin:graph[top])
if(dmin[isPairedV[vecin]]==INF){/// daca este in matching sdt, ne aflam pe o muchie din match
dmin[isPairedV[vecin]]=dmin[top]+1;
Q.push(isPairedV[vecin]);
}
}
}
return dmin[0]!=INF;
}
bool DFS(int x){
if(x==0)///nodul x face parte din drumul catre un nod nevizitat din U
return 1;
for(auto vecin:graph[x])
if(dmin[isPairedV[vecin]]==dmin[x]+1 && DFS(isPairedV[vecin])){///daca drumul x-v-isPairedV[vecin] a fost parcurs de BFS si ajunge la un nod nevizitat din U
isPairedU[x]=vecin;
isPairedV[vecin]=x;
return 1;
}
return 0;
}
void HopcroftKarp(){
while(BFS()){
for(int i=1;i<=n;i++)
if(isPairedU[i]==0 && DFS(i))
nrm++;
}
}
int main(){
freopen("cuplaj.in","r",stdin);
freopen("cuplaj.out","w",stdout);
scanf("%d%d%d", &n, &m, &e);
for(int i=1;i<=e;i++){
int x,y;
scanf("%d%d", &x, &y);
graph[x].push_back(y);
}
HopcroftKarp();
printf("%d\n", nrm);
for(int i=1;i<=n;i++)
if(isPairedU[i]!=0)
printf("%d %d\n", i, isPairedU[i]);
return 0;
}