Pagini recente » Cod sursa (job #1472360) | Cod sursa (job #1177563) | Cod sursa (job #2705493) | Cod sursa (job #1688215) | Cod sursa (job #2409658)
#include <fstream>
#include <vector>
using namespace std;
ifstream in("cuplaj.in");
ofstream out("cuplaj.out");
const int N=10005;
int st[N],dr[N],n,m,k,sol;//side[x]=nodul care il are pe x in side(st/dr)
vector<int>a[N];
bool viz[N];
void resetviz();
bool cupleaza(int x)
{
if(viz[x]==true)
return false;
viz[x]=true;
int y;
for(unsigned i=0;i<a[x].size();i++)
{
y=a[x][i];
if(dr[y]==0)//cuplez cu un vecin nefolosit
{
dr[y]=x;
st[x]=y;
sol++;//cresc cardinalitatea, adaug o muchie
return true;
}
}
for(unsigned i=0;i<a[x].size();i++)
{
y=a[x][i];
if(cupleaza(dr[y]))//pot schimba fostul nod conectat la y, pentru a cupla x la y
{
dr[y]=x;
st[x]=y;
return true;//nu mai cresc solutia, nr de muchii alese ramane acelasi, doar schimb capetele
}
}
return false;
}
int main()
{
in>>n>>m>>k;
for(int x,y,i=1;i<=k;i++)
{
in>>x>>y;
a[x].push_back(y);
}
bool ok=true;
while(ok)
{
ok=false;
resetviz();
for(int i=1;i<=n;i++)
if(st[i]==0 && cupleaza(i))//st[i]=0-->necuplat si cupleaza-->reusesc sa cuplez
ok=true;//fac o schimbare,continua ciclul
}//cuplare bubble
out<<sol<<'\n';
for(int i=1;i<=n;i++)
if(st[i]!=0)
out<<i<<' '<<st[i]<<'\n';
return 0;
}
void resetviz()
{
for(int i=1;i<=n;i++)
viz[i]=false;
}