Pagini recente » Cod sursa (job #2348858) | Cod sursa (job #1182083) | Cod sursa (job #3150713) | Cod sursa (job #2967648) | Cod sursa (job #2962355)
#include <bits/stdc++.h>
using namespace std;
ifstream f("cuplaj.in");
ofstream g("cuplaj.out");
int n,m,e,N,ncur,k,i,nvec,fluxm,mini,j,u,v,d,s;
int viz[20005];
pair<int,int>tata[20005];
vector<vector<pair<pair<int, int>, int>>> l(20005);
int bfs()
{
queue<int>que;
que.push(0);
for(i=0;i<=N;i++)
{
tata[i]={-1,-1};
viz[i]=0;
}
viz[0]++;
while(que.size()!=0)
{
ncur = que.front();
if(ncur == N)
return 1;
k=0;
for(i=0;i<l[ncur].size();i++)
{
nvec=l[ncur][i].first.first;
if(l[ncur][i].first.second>0&&viz[nvec]==0)
{
viz[nvec]++;
tata[nvec]={ncur, k};
que.push(nvec);
}
k++;
}
que.pop();
}
return 0;
}
int Edmonds_Karp()
{
fluxm = 0;
while(bfs())
{
for(i=0;i<l[s].size();i++)
{
ncur = l[s][i].first.first;
if(l[ncur][l[s][i].second].first.second > 0 && viz[ncur])
{
mini = INT_MAX;
tata[s] = {ncur, l[s][i].second};
d = s;
while(tata[d].first!=-1)
{
mini=min(mini, l[tata[d].first][tata[d].second].first.second);
d=tata[d].first;
}
fluxm += mini;
d=s;
while(tata[d].first!=-1)
{
l[tata[d].first][tata[d].second].first.second -= mini;
l[d][l[tata[d].first][tata[d].second].second].first.second += mini;
d=tata[d].first;}}}}
return fluxm;
}
int main()
{
f>>n>>m>>e;
s=n+m+1;
for(i=0;i<e;i++)
{
f>>u>>v;
l[u].push_back({{v+n,1}, l[v+n].size()});
l[v+n].push_back({{u, 0}, l[u].size()-1});
}
for(i=1;i<=n;i++)
{
l[0].push_back({{i, 1}, l[i].size()});
l[i].push_back({{0, 0}, l[0].size()-1});
}
for(i=1;i<=m;i++)
{
l[i+n].push_back({{s,1}, l[s].size()});
l[s].push_back({{i+n,0}, l[i+n].size()-1});
}
g<<Edmonds_Karp()<<"\n";
for(i=1;i<=n;i++)
for(j=0;j<l[i].size();j++)
{
if(l[i][j].first.second!=1&&l[i][j].first.first!=0)
g<<i<<" "<<l[i][j].first.first-n<<"\n";
}
return 0;
}