Pagini recente » Cod sursa (job #3033254) | Cod sursa (job #1602251) | Cod sursa (job #502926) | Cod sursa (job #2914675) | Cod sursa (job #1892519)
#include <iostream>
#include<fstream>
#include<vector>
#include<cstring>
using namespace std;
#define N 10100
#define DIM 1000
vector<int> a[N];
char buff[DIM];
int poz;
int viz[N],l[N],v[N],r[N],i,j,n,m,k,nr;
///l[i] perechea din stanga a lui i
///r[i] perechea din dreapta a lui i
bool ok;
bool pairup(int n)
{
if(viz[n])return 0;
viz[n]=1;///daca am continuat inseamna ca n e neutilizat,deci ii caut pereche
int nod;
for(int i=0;i<v[n];++i)
{
nod=a[n][i];
if(!l[nod]) ///verific vecinii lui n pana cand gasesc unul neutilizat si formez pereche
{
r[n]=nod;
l[nod]=n;
return 1;
}
}
for(int i=0;i<v[n];++i) ///daca am ajuns aici inseamna ca toti vecinii lui n au deja pereche
{
nod=a[n][i];
if(pairup(l[nod]))///verific perechea vecinului
{
r[n]=nod;///creare muchie noua
l[nod]=n;
return 1;
}
}
return 0;///nu s-a mai gasit vreo muchie posibila
}
ifstream f("cuplaj.in");
void R(int&x)
{
x=0;
while(buff[poz]<'0' || buff[poz]>'9')
if(++poz==DIM)
{
poz=0;
f.read(buff,DIM);
}
while(buff[poz]>='0' && buff[poz]<='9')
{
x=x*10+buff[poz]-'0';
if(++poz==DIM)
{
poz=0;
f.read(buff,DIM);
}
}
}
int main()
{
R(n);R(m);R(k);
for(int l=0;l<k;++l)
{
R(i);R(j);
a[i].push_back(j);
++v[i];
}
ok=1;
while(ok)
{
ok=0;
memset(viz,0,(n+1)*sizeof(int));
for(i=1;i<=n;++i)
if(!r[i])///verific daca nodul i are pereche
ok|=pairup(i);///efectuez secventa cat timp se mai pot crea muchii
/// "|=" sau logic
}
nr=0;
for(i=1;i<=n;++i)
if(r[i])++nr;
ofstream g("cuplaj.out");
g<<nr<<'\n';
for(i=1;i<=n;++i)
if(r[i])
g<<i<<" "<<r[i]<<'\n';
return 0;
}