Pagini recente » Cod sursa (job #2133171) | Cod sursa (job #2914580) | Cod sursa (job #1714559) | Cod sursa (job #2979847) | Cod sursa (job #2850432)
#include <bits/stdc++.h>
using namespace std;
ifstream in("cuplaj.in");
ofstream out("cuplaj.out");
int n1,n2,m,x,y,link[100010],viz[100010],vizn;
vector<vector<int>>a;
void leaga(int a,int b)
{
link[link[a]]=link[link[b]]=0;
link[b]=a;
link[a]=b;
return;
}
int cautaredrum(int nod)
{
viz[nod]=vizn;
for(auto x:a[nod])
{
if(viz[link[x]]==vizn||x==link[nod])
continue;
if(link[x]!=0)
{
int z=cautaredrum(link[x]);
if(z)
{
leaga(nod,x);
return x;
}
}
else
{
leaga(nod,x);
return x;
}
}
return 0;
}
int main()
{
in>>n1>>n2>>m;
a.resize(n1+n2+5);
while(m--)
{
in>>x>>y;
y+=n1;
a[x].push_back(y);
a[y].push_back(x);
}
bool ver=true;
while(ver)
{
++vizn;
ver=false;
for(int i=1;i<=n1;++i)
{
if(link[i]==0&&viz[i]<vizn)
{
int b=cautaredrum(i);
if(b)
ver=true;
}
}
}
int ans=0;
for(int i=1;i<=n1;++i)
if(link[i])
++ans;
out<<ans<<'\n';
for(int i=1;i<=n1;++i)
if(link[i])
out<<i<<' '<<link[i]-n1<<'\n';
return 0;
}