Pagini recente » Cod sursa (job #1141272) | Cod sursa (job #1255206) | Cod sursa (job #1254096) | Monitorul de evaluare | Cod sursa (job #2214266)
#include<fstream>
#include<iostream>
#include<vector>
#include<string.h>
using namespace std;
#define MAX 10001
int lft[MAX], rgt[MAX];
bool newEdge(int x, int y){
rgt[y]=x;
lft[x]=y;
return true;
}
bool pairup(int x, bool viz[], vector<int> G[]){
if(viz[x]) return false;
viz[x]=true;
vector<int>::iterator it;
for(it=G[x].begin(); it!=G[x].end();it++)
if(!rgt[*it])
return newEdge(x,*it);
for(it=G[x].begin(); it!=G[x].end(); it++)
if(pairup(rgt[*it],viz,G))
return newEdge(x,*it);
return false;
}
int main(){
ifstream in("cuplaj.in");
int n,m,e,x,y;
bool change=true;
in>>n>>m>>e;
vector<int> G[n+1];
bool viz[n+1];
while(e--){
in>>x>>y;
G[x].push_back(y);
}
in.close();
while(change){
change=false;
memset(viz,false,sizeof viz);
for(e=1;e<=n;e++)
if(!lft[e])
change |= pairup(e,viz,G);
}
x=0;
for(e=1;e<=n;e++) x+= (lft[e]>0);
FILE *out=fopen("cuplaj.out","w");
fprintf(out,"%d\n",x);
for(e=1;e<=n;e++)
if(lft[e]>0) fprintf(out,"%i %i\n",e,lft[e]);
return 0;
}