Pagini recente » Cod sursa (job #409848) | Istoria paginii preoni-2008/clasament/runda-1/10 | Cod sursa (job #3287746) | Cod sursa (job #1341091) | Cod sursa (job #1362743)
#include <iostream>
#include <vector>
#include <cstring>
#include <fstream>
using namespace std;
const int maxn =2*10100;
vector <int> Graf[maxn];
int mate[maxn],changeth=1,N,M,E;
bool viz[maxn];
bool match(int nod)
{
if(viz[nod])
return 0;
viz[nod]=1;
vector <int> :: iterator it;
for(it=Graf[nod].begin();it!=Graf[nod].end();it++)
if(!mate[*it]){
viz[*it]=1;
mate[nod]=*it;
mate[*it]=nod;
return 1;
}
for(it=Graf[nod].begin();it!=Graf[nod].end();it++)
if(match(mate[*it])){
mate[nod]=*it;
mate[*it]=nod;
return 1;
}
return 0;
}
int main()
{
ifstream in("cuplaj.in");
ofstream out("cuplaj.out");
int x,y,i;
in>>N>>M>>E;
while(E--)
{
in>>x>>y;
y+=N+1;
Graf[x].push_back(y);
Graf[y].push_back(x);
}
while(changeth)
{
changeth=0;
memset(viz,0,sizeof(viz));
for(i=1;i<=N;i++)
if(!mate[i])
changeth = match(i);
}
changeth=0;
for(i=1;i<=N;i++)
if(mate[i]>0)
changeth++;
out<<changeth<<"\n";
for(i=1;i<=N;i++)
if(mate[i]>0)
out<<i<<" "<<mate[i]-N-1<<"\n";
return 0;
}