Pagini recente » Cod sursa (job #397086) | Cod sursa (job #1324012) | Cod sursa (job #2424236) | Cod sursa (job #1095345) | Cod sursa (job #1902823)
#include <fstream>
#include <vector>
#include <queue>
#include <climits>
#include <cstring>
#include <algorithm>
#define nmax 20005
#define mmax 240005
using namespace std;
int F[mmax],C[mmax];
#define F (F+120003)
#define C (C+120003)
struct arc
{
int ef,nr;
arc(int a=0, int b=0){ef=a;nr=b;}
};
int n,nou;
vector <arc> a[nmax];
arc t[nmax];
bool viz[nmax];
queue <int> q;
int abs(int x){if (x<0) return -x;return x;}
vector <arc> r;
void bf()
{
memset(viz,0,sizeof(viz));
q.push(0);viz[0]=1;
int x,y,ind,i;
while (!q.empty())
{
x=q.front();q.pop();
if (x!=n)
{
for (i=0;i<a[x].size();i++)
{
y=a[x][i].ef;ind=a[x][i].nr;
if ( (!viz[y]) && (C[ind]>F[ind]) )
{
t[y].ef=x;t[y].nr=ind;
viz[y]=1;
q.push(y);
}
}
}
}
}
inline bool comp(arc x, arc y)
{
return x.ef<y.ef;
}
int main()
{
ifstream fin("cuplaj.in");
ofstream fout("cuplaj.out");
int n1,n2,m,i,x,y,ind,flm,cup=0;
fin>>n1>>n2>>m;
n=n1+n2+1;
for (i=1;i<=n1;i++)
{
nou++;
a[0].push_back({i,nou});
a[i].push_back({0,-nou});
C[nou]=1;
//C[-nou]=-1;
}
for (i=1;i<=m;i++)
{
fin>>x>>y;
nou++;y+=n1;
a[x].push_back({y,nou});
a[y].push_back({x,-nou});
C[nou]=1;
}
for (i=n1+1;i<=n-1;i++)
{
nou++;
a[i].push_back({n,nou});
a[n].push_back({i,-nou});
C[nou]=1;
}
do
{
bf();
for (i=0; i<a[n].size() && viz[n];i++)
{
x=a[n][i].ef;ind=abs(a[n][i].nr);
if ( viz[x] && (C[ind]>F[ind]) )
{
t[n].ef=x;t[n].nr=ind;flm=INT_MAX;
for (x=n; x!=0 && flm; x=t[x].ef)
{
ind=t[x].nr;
flm=min(flm,C[ind]-F[ind]);
}
if (flm)
{
x=a[n][i].ef;ind=abs(a[n][i].nr);
{
cup+=flm;
r.push_back({t[x].ef,x});
//actualizam solutia
}
for (x=n; x!=0; x=t[x].ef)
{
ind=t[x].nr;
F[ind]+=flm;
F[-ind]-=flm;
}
}
}
}
}
while(viz[n]);
fout<<cup<<'\n';
/*sort(r.begin(),r.end(),comp);
for (i=0;i<cup;i++)
fout<<r[i].ef<<' '<<r[i].nr-n1<<'\n';*/
fin.close();
fout.close();
return 0;
}