Pagini recente » Cod sursa (job #747410) | Cod sursa (job #70178) | Cod sursa (job #2434793) | Cod sursa (job #761096) | Cod sursa (job #1890823)
#include<fstream>
#include<vector>
using namespace std;
ifstream f("cuplaj.in");
ofstream g("cuplaj.out");
vector<int>v[10005];
int st[10005],dr[10005];
bool viz[10005],ok=1;
int n,m,x,y,t,con,i;
bool cuplaj(int dad)//nodul din primul graf din care plec= dad
{
int i,son;
if(viz[dad])//daca este folosit
return 0;
viz[dad]=1;//marchez folosirea lui
for(i=0;i<v[dad].size();i++)//din vectorul de adiacenta iau fiecare nod cu care este asociat dad(nodurile din al doilea graf)
{
son=v[dad][i];//nodul de care este legat
if(dr[son]==0)//daca nu are deja alta legatura in primul graf fac legatura si ma opresc
{
st[dad]=son;
dr[son]=dad;
return 1;
}
if(cuplaj(dr[son]))//refac cuplajul nodului legat de son din primul graf
{
st[dad]=son;
dr[son]=dad;
return 1;
}
}
return 0;
}
int main()
{
f>>n>>m>>t;
while(t)
{
t--;
f>>x>>y;
v[x].push_back(y);//vector de adiacenta
}
while(ok==1)
{
ok=0;
for(i=1;i<=n;i++)//initializez
viz[i]=0;
for(int i=1;i<=n;i++)
if(st[i]==0&&cuplaj(i)==1)//am putut adauga o muchie in cuplaj
ok=1;
}
for(i=1;i<=n;i++)//contorizez muchiile
if(st[i]!=0)
con++;
g<<con<<"\n";
for(i=1;i<=n;i++)
if(st[i]!=0)
g<<i<<" "<<st[i]<<"\n";
return 0;
}