Pagini recente » Cod sursa (job #1873891) | Cod sursa (job #306522) | Cod sursa (job #2720640) | Cod sursa (job #2269431) | Cod sursa (job #3154969)
#include <fstream>
#include <vector>
#include <cstring>
using namespace std;
ifstream in("cuplaj.in");
ofstream out("cuplaj.out");
int n, m, edgeCount;
vector<int> edges[10001];
int l[10001], r[10001];
bool tk[10001];
bool pairup(int node)
{
if(tk[node])
return false;
tk[node]=true;
for(auto i=edges[node].begin();i!=edges[node].end();i++)
if(r[*i]==0)
{
r[*i]=node;
l[node]=*i;
return true;
}
for(auto i=edges[node].begin();i!=edges[node].end();i++)
if(pairup(r[*i]))
{
r[*i]=node;
l[node]=*i;
return true;
}
return false;
}
int main() {
in>>n>>m>>edgeCount;
while(edgeCount)
{
edgeCount--;
int x, y;
in>>x>>y;
edges[x].push_back(y);
}
bool changed=true;
while(changed)
{
changed=false;
memset(tk, false, sizeof(tk));
for(int i=1;i<=n;i++)
if(l[i]==0)
changed |= pairup(i);
}
int k=0;
for(int i=1;i<=n;i++)
if(l[i]>0)
k++;
out<<k<<'\n';
for(int i=1;i<=n;i++)
if(l[i]!=0)
out<<i<<' '<<l[i]<<'\n';
return 0;
}