Cod sursa(job #1039151)
Utilizator | Data | 22 noiembrie 2013 16:58:46 | |
---|---|---|---|
Problema | Cuplaj maxim in graf bipartit | Scor | 0 |
Compilator | cpp | Status | done |
Runda | Arhiva educationala | Marime | 2.92 kb |
#include <fstream>
#include <vector>
using namespace std;
ifstream fi("cuplaj.in");
ofstream fo("cuplaj.out");
int n,m,leg,i,a,b;
vector <int> AD[100];
vector <int> :: iterator it;
int SPOUSE[100];
int Q[100],prim,ultim;
int P[100];
int VIZ[100];
int varf,vecin;
int gasit;
int SOL[100],k;
int main()
{
fi>>n>>m>>leg;
for (i=1;i<=leg;i++)
{
fi>>a>>b;
AD[a].push_back(b);
AD[b].push_back(a);
}
for (i=1;i<=n+m;i++)
SPOUSE[i]=0;
while (1)
{
gasit=0;
prim=1;
ultim=0;
for (i=1;i<=n+m;i++)
VIZ[i]=0;
// varfurile fara SPOUSE din X
for (i=1;i<=n;i++)
if (SPOUSE[i]==0)
{
ultim++;
Q[ultim]=i;
P[i]=0;
VIZ[i]=1;
}
while (prim<=ultim)
{
// se expandeaza Q[prim]
varf=Q[prim];
if (varf<=n)
for (it=AD[varf].begin();it!=AD[varf].end();it++)
{
vecin=(*it);
if (VIZ[vecin]==0 && (vecin!=SPOUSE[varf]))
{
ultim++;
Q[ultim]=vecin;
VIZ[vecin]=1;
P[vecin]=varf;
}
}
else
if (SPOUSE[varf]==0)
{
// bingo !!
gasit=1;
k=0;
while(varf!=0)
{
SOL[++k]=varf;
varf=P[varf];
}
for (i=1;i<=k;i=i+2)
{
SPOUSE[SOL[i]]=SOL[i+1];
SPOUSE[SOL[i+1]]=SOL[i];
}
break;
}
else
{
ultim++;
Q[ultim]=SPOUSE[varf];
VIZ[SPOUSE[varf]]=1;
P[SPOUSE[varf]]=varf;
}
prim++;
}
if (gasit==0)
break;
}
for (i=1;i<=n;i++)
fo<<SPOUSE[i]-n<<" ";
fi.close();
fo.close();
return 0;
}