Pagini recente » Cod sursa (job #1901826) | Cod sursa (job #1283351) | Cod sursa (job #2571640) | Cod sursa (job #1343113) | Cod sursa (job #3336560)
#include <bits/stdc++.h>
using namespace std;
const int nmax=2e4+5;
ifstream f("cuplaj.in");
ofstream g("cuplaj.out");
vector <vector<int>>adj;
vector<vector<int>> capacity;
vector<int>parent;
vector<pair<int,int>> ans;
int bfs (int s ,int t)
{
fill(parent.begin(),parent.end(),-1);
parent[s]=-2;
queue<pair<int,int>> q;
q.push({s,INT_MAX});
while(!q.empty())
{
int nod=q.front().first;
int flow=q.front().second;
q.pop();
for(auto it : adj[nod])
if(parent[it]==-1 && capacity[nod][it])
{
parent[it]=nod;
int new_flow=min(flow,capacity[nod][it]);
if(it==t)
return new_flow;
q.push({it,new_flow});
}
}
return 0;
}
int maxflow(int s,int t)
{
int flow=0;
int new_flow;
while(new_flow=bfs(s,t))
{
flow+=new_flow;
int nod =t;
ans.push_back({parent[parent[t]],parent[t]});
while(nod!=s)
{
int prev=parent[nod];
capacity[prev][nod]-=new_flow;
capacity[nod][prev]+=new_flow;
nod=prev;
}
}
return flow;
}
int main ()
{
int n ,m,k;
f>>n>>m>>k;
parent.resize(nmax);
capacity.resize(nmax);
adj.resize(nmax);
capacity[0].resize(nmax);
capacity[n+m+1].resize(nmax);
for(int i=1;i<=n+m;i++)
{capacity[i].resize(nmax);
if(i<=n)
{
adj[i].push_back(0);
adj[0].push_back(i);
capacity[0][i]=1;
}
else{
adj[i].push_back(n+m+1);
adj[n+m+1].push_back(i);
capacity[i][n+m+1]=1;
}
}
while(k--)
{
int x,y;
f>>x>>y;
adj[x].push_back(y+n);
adj[y+n].push_back(x);
capacity[x][y+n]=1;
}
g<<maxflow(0,n+m+1)<<'\n';
for(auto it : ans)
g<<it.first<<' '<<it.second-n<<'\n';
}