Pagini recente » Cod sursa (job #1018659) | Cod sursa (job #1024670) | Cod sursa (job #197298) | Cod sursa (job #2266409) | Cod sursa (job #1830059)
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <vector>
#include <queue>
#define MaxN 10005
#define INF 2140000000
using namespace std;
FILE *IN,*OUT;
int A[MaxN],B[MaxN],M,Asize,Bsize,X,Y,Size=0;
vector <int>Graph[MaxN];
bool execute=true,used[MaxN];
bool DFS(int node)
{
if(used[node])return false;
else used[node]=true;
for(int i=0;i<Graph[node].size();i++)
{
if(B[Graph[node][i]]==0)
{
A[node]=Graph[node][i];
B[Graph[node][i]]=node;
return true;
}
else if(DFS(B[Graph[node][i]]))
{
A[node]=Graph[node][i];
B[Graph[node][i]]=node;
return true;
}
}
return false;
}
int main()
{
IN=fopen("cuplaj.in","r");
OUT=fopen("cuplaj.out","w");
fscanf(IN,"%d%d%d",&Asize,&Bsize,&M);
for(int i=1;i<=M;i++)
{
fscanf(IN,"%d%d",&X,&Y);
Graph[X].push_back(Y);
}
while(execute)
{
int Add=0;
memset(used,0,sizeof used);
for(int i=1;i<=Asize;i++)
if(A[i]==0)
if(DFS(i))
Add++;
if(Add==0)
execute=false;
Size+=Add;
}
fprintf(OUT,"%d \n",Size);
for(int i=1;i<=Asize;i++)
if(A[i])fprintf(OUT,"%d %d\n",i,A[i]);
return 0;
}