Pagini recente » Cod sursa (job #2293567) | Cod sursa (job #2299224) | Cod sursa (job #2315255) | Cod sursa (job #2215042) | Cod sursa (job #625705)
Cod sursa(job #625705)
#include<vector>
#include<queue>
#include<fstream>
#include<cstring>
using namespace std;
ofstream g("cuplaj.out");
vector<vector<int> > mat(10000);
int n,m,e;
int flux[10002][10002],cap[10002][10002];
int up[20005];
inline int bfs(int s, int d)
{
int i,x,xx;
queue<int> q;
memset(up,-1,sizeof(up));
q.push(s);
up[s]=0;
while(!q.empty())
{
xx=q.front();
for(i=0;i<mat[xx].size();++i)
{
x=mat[xx][i];
if(up[x]==-1 && flux[xx][x]<cap[xx][x])
{
q.push(x);
up[x]=xx;
if(x==d)
return 1;
}
}
q.pop();
}
return 0;
}
void fluxmax()
{
int i,r,c=0,j;
while(bfs(0,n+m+1))
{
for(i=1;i<n+m+1;++i)
if(up[i]!=-1 && flux[i][n+m+1]<cap[i][n+m+1])
{
r=cap[i][n+m+1]-flux[i][n+m+1];
for(j=i;j!=0 && r>0; j=up[j])
r=min(r,cap[up[j]][j]-flux[up[j]][j]);
if(r==0)
continue;
flux[i][n+m+1]+=r;
flux[n+m+1][i]-=r;
for(j=i;j!=0;j=up[j])
{
flux[up[j]][j]+=r;
flux[j][up[j]]-=r;
}
c+=r;
}
}
g<<c;
}
int main()
{
ifstream f("cuplaj.in");
f>>n>>m>>e;
int x,y;
for(;e;--e)
{
f>>x>>y;
mat[0].push_back(x);
mat[x].push_back(0);
mat[x].push_back(y+n);
mat[y+n].push_back(x);
mat[y+n].push_back(n+m+1);
mat[n+m+1].push_back(y+n);
cap[0][x]=1;
cap[x][y+n]=1;
cap[y+n][n+m+1]=1;
}
fluxmax();
}