Pagini recente » Cod sursa (job #2513250) | Cod sursa (job #539190) | Cod sursa (job #624030) | Cod sursa (job #2637878) | Cod sursa (job #2627477)
#include <fstream>
#include <vector>
#include <queue>
using namespace std;
ifstream cin("cuplaj.in");
ofstream cout("cuplaj.out");
const int lim=2e4+5;
struct Op
{
int nod;int capp;int opus;
};
vector<Op> vec[lim];
pair<int,int> pred[lim];
queue<int> q;
int main()
{
int n,m,e,a,b;
cin>>n>>m>>e;
for(int i=1;i<=e;++i)
{
cin>>a>>b;
int nr1=vec[a].size();
int nr2=vec[b+n].size();
vec[a].push_back({b+n,1,nr2});
vec[b+n].push_back({a,0,nr1});
}
for(int i=1;i<=n;++i)
{
int nr1=vec[0].size();
int nr2=vec[i].size();
vec[0].push_back({i,1,nr2});
vec[i].push_back({0,0,nr1});
}
for(int i=n+1;i<=n+m;++i)
{
int nr1=vec[i].size();
int nr2=vec[n+m+1].size();
vec[i].push_back({n+m+1,1,nr2});
vec[n+m+1].push_back({i,0,nr1});
}
int flow=0,ads;
do
{
for(int i=1;i<=n+m+1;++i)
pred[i]={-1,0};
pred[0]={-2,0};
q.push(0);
while(!q.empty())
{
int x=q.front();
q.pop();
for(int i=0;i<vec[x].size();++i)
if(pred[vec[x][i].nod].first==-1 and vec[x][i].capp>0)
{
pred[vec[x][i].nod]={x,i};
q.push(vec[x][i].nod);
}
}
if(pred[n+m+1].first!=-1)
for(int i=n+1;i<=n+m;++i)
if(pred[i].first!=-1)
{
ads=vec[i][vec[n+m+1][i-n-1].opus].capp;
for(int k=i;pred[k].first>=0;k=pred[k].first)
ads=min(ads,vec[pred[k].first][pred[k].second].capp);
if(ads==0) continue;
vec[i][vec[n+m+1][i-n-1].opus].capp-=ads;
vec[n+m+1][i-n-1].capp+=ads;
for(int k=i;pred[k].first>=0;k=pred[k].first)
{
vec[pred[k].first][pred[k].second].capp-=ads;
vec[k][vec[pred[k].first][pred[k].second].opus].capp+=ads;
}
flow+=ads;
}
}while(pred[n+m+1].first!=-1);
cout<<flow<<'\n';
for(int i=1;i<=n;++i)
for(Op t:vec[i])
if(t.nod>i and t.capp==0)
cout<<i<<' '<<t.nod-n<<'\n';
return 0;
}