Pagini recente » Cod sursa (job #1729666) | Cod sursa (job #2893772) | Cod sursa (job #35239) | Cod sursa (job #1947397) | Cod sursa (job #902557)
Cod sursa(job #902557)
#include<fstream>
#define nmax 10001
using namespace std;
struct nod_lista{
int val;
nod_lista *link;
};
nod_lista *G[nmax],*Last[nmax];
int viz[nmax],st[nmax],dr[nmax],cuplaj;
int L,R,E;
void adauga(int unde,int ce)
{
nod_lista *q=new nod_lista;
q->val=ce;
q->link=NULL;
if(!G[unde])
G[unde]=Last[unde]=q;
else
{
Last[unde]->link=q;
Last[unde]=q;
}
}
void citeste()
{
ifstream f("cuplaj.in");
int i,x,y;
f>>L>>R>>E;
for(i=1;i<=E;i++)
{
f>>x>>y;
adauga(x,y);
}
f.close();
}
int cuplare(int nod)
{
if(viz[nod])
return 0;
else
viz[nod]=1;
nod_lista *q=G[nod];
while(q)
{
int vecin=q->val;
if(!st[vecin])//daca vecinul din dreapta n-are pe nimeni in stanga
{
//putem sa-i cuplam
st[vecin]=nod;
dr[nod]=vecin;
return 1;
}
q=q->link;
}
//daca nu am gasit nici un vecin liber
q=G[nod];
while(q)
{
int vecin=q->val;
if(cuplare(st[vecin])) //dca pot realiza o cuplare pentru cel care-l ocupa si sa-l eliberez astfel
{
st[vecin]=nod;
dr[nod]=vecin;
return 1;
}
q=q->link;
}
//daca nu sa reusit nimic
return 0;
}
void rezolva()
{
cuplaj=1;
int i;
while(cuplaj) // cat timp a avut loc o cuplare
{
//poate se mai realizeaza una
for(i=1;i<=L;i++)
viz[i]=0;
cuplaj=0;
for(i=1;i<=L;i++)
if(!dr[i])
cuplaj+=cuplare(i);
}
cuplaj=0;
for(i=1;i<=L;i++)
if(dr[i])
++cuplaj;
}
void scrie()
{
ofstream g("cuplaj.out");
int i;
g<<cuplaj<<'\n';
for(i=1;i<=L;i++)
if(dr[i])
g<<i<<' '<<dr[i]<<'\n';
g.close();
}
int main()
{
citeste();
rezolva();
scrie();
return 0;
}