Pagini recente » Cod sursa (job #3357817) | Istoria paginii utilizator/var_jack | Cod sursa (job #1307497) | Cod sursa (job #1068498) | Cod sursa (job #3338177)
#include <fstream>
#include <vector>
using namespace std;
ifstream cin("cuplaj.in");
ofstream cout("cuplaj.out");
int cuplat[100001],viz[100001],cnt,e,n,m;
vector<int>g[100001];
void cuplare(int a,int b)
{
cuplat[cuplat[a]] = 0;
cuplat[a] = b;
cuplat[cuplat[b]] = 0;
cuplat[b] = a;
}
bool dfs(int nod)
{
viz[nod] = cnt;
for(auto vecin:g[nod])
if(viz[vecin]!=cnt)
{
viz[vecin] = cnt;
if(!cuplat[vecin])
{
cuplare(nod,vecin);
return 1;
}
if(cuplat[vecin] && dfs(cuplat[vecin]) == 1)
{
cuplare(nod,vecin);
return 1;
}
}
return 0;
}
int main()
{
cin>>n>>m>>e;
for(int i=1; i<=e; i++)
{
int a,b;
cin>>a>>b;
g[a].push_back(n+b);
g[n+b].push_back(a);
}
bool ok=1;
while(ok)
{
ok=0;
cnt++;
for(int i=1; i<=m+n; i++)
{
if(!cuplat[i] && viz[i] != cnt)
ok = ok | dfs(i);
}
}
int nr = 0;
for(int i=1; i<=n; i++)
if(cuplat[i]!=0)
nr++;
cout<<nr<<'\n';
for(int i=1; i<=n; i++)
{
if(cuplat[i]!=0)
cout<<i<<" "<<cuplat[i]-n<<'\n';
}
return 0;
}