Pagini recente » Cod sursa (job #2027693) | Cod sursa (job #2570281) | Cod sursa (job #2767734) | Cod sursa (job #1088593) | Cod sursa (job #2047324)
#include <bits/stdc++.h>
using namespace std;
ifstream fin("cuplaj.in");
ofstream fout("cuplaj.out");
bool cupleaza(int left,vector<int>& con_left,vector<int>& con_right,vector<vector<int>>& path,bitset<10010>& viz)
{
if(viz[left])
return false;
viz[left]=1;
for(int i=0;i<path[left].size();i++) ///try to connect to an unconnected node
{
if(!con_right[path[left][i]])
{
con_right[path[left][i]]=left;
con_left[left]=path[left][i];
return true;
}
}
for(int i=0;i<path[left].size();i++) ///if there are no available nodes try to reconnect until you make one available
{
if(cupleaza(con_right[path[left][i]],con_left,con_right,path,viz))
{
con_right[path[left][i]]=left;
con_left[left]=path[left][i];
return true;
}
}
return false;
}
int main()
{
int left,right,edges,x,y,nr_con=0;
fin>>left>>right>>edges;
vector<vector<int>> path(left+10);
vector<int> con_left(left+5);
vector<int> con_right(right+5);
bitset<10010> viz;
for(;edges;edges--)
{
fin>>x>>y;
path[x].push_back(y);
}
int ok=1;
while(ok)
{
ok=0;
viz.reset();
for(int i=1;i<=left;i++)
{
if(!con_left[i]&&cupleaza(i,con_left,con_right,path,viz))
{
nr_con++;
ok=1;
}
}
}
fout<<nr_con<<'\n';
for(int i=1;i<=left;i++)
if(con_left[i])
fout<<i<<' '<<con_left[i]<<'\n';
return 0;
}