Pagini recente » Cod sursa (job #1780047) | Cod sursa (job #248960) | Cod sursa (job #308656) | Cod sursa (job #155554) | Cod sursa (job #625717)
Cod sursa(job #625717)
#include<vector>
#include<queue>
#include<fstream>
#include<cstring>
using namespace std;
ofstream g("cuplaj.out");
vector<vector<int> > mat(10003);
int n,m,e;
struct flux
{
int f,c;
};
flux cap[10002][10002];
int up[20002];
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 && cap[xx][x].f<cap[xx][x].c)
{
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 && cap[i][n+m+1].f<cap[i][n+m+1].c)
{
r=cap[i][n+m+1].c-cap[i][n+m+1].f;
for(j=i;j!=0 && r>0; j=up[j])
r=min(r,cap[up[j]][j].c-cap[up[j]][j].f);
if(r==0)
continue;
cap[i][n+m+1].f+=r;
cap[n+m+1][i].f-=r;
for(j=i;j!=0;j=up[j])
{
cap[up[j]][j].f+=r;
cap[j][up[j]].f-=r;
}
c+=r;
}
}
g<<c<<"\n";
}
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].c=1;
cap[x][y+n].c=1;
cap[y+n][n+m+1].c=1;
}
fluxmax();
}