Pagini recente » Cod sursa (job #327453) | Cod sursa (job #862982) | Cod sursa (job #2759407) | Cod sursa (job #1942301) | Cod sursa (job #2771473)
#include <bits/stdc++.h>
using namespace std;
#define ll long long
#define ipair pair<int, int>
ifstream fin("cuplaj.in");
ofstream fout("cuplaj.out");
const int mxN=1e4, mxK=1e5, inf=1e9;
int n, m, k, d[2*mxN+2], p[2*mxN+2];
vector<int> G[2*mxN+2];
struct edge
{
int u, v, rev, cap;
};
edge E[2*(mxK+2*mxN)];
int main()
{
fin >> n >> m >> k;
int id=0;
for(int i=1; i<=n; i++)
{
E[2*id]={0, i, 2*id+1, 1};
E[2*id+1]={i, 0, 2*id, 0};
G[0].push_back(2*id);
G[i].push_back(2*id+1);
id++;
}
for(int i=1; i<=m; i++)
{
E[2*id]={n+i, n+m+1, 2*id+1, 1};
E[2*id+1]={n+m+1, n+i, 2*id, 0};
G[n+i].push_back(2*id);
G[n+m+1].push_back(2*id+1);
id++;
}
for(int i=0; i<k; i++)
{
int a, b;
fin >> a >> b;
b+=n;
E[2*id]={a, b, 2*id+1, 1};
E[2*id+1]={b, a, 2*id, 0};
G[a].push_back(2*id);
G[b].push_back(2*id+1);
id++;
}
int flow=0;
while(1)
{
for(int i=0; i<=n+m+1; i++)
d[i]=inf, p[i]=-1;
d[0]=0;
queue<int> Q;
Q.push(0);
bool found=false;
while(!Q.empty() && !found)
{
int u=Q.front();
Q.pop();
for(int i : G[u])
{
int v=E[i].v;
if(d[v]==inf && E[i].cap)
{
d[v]=d[u]+1;
p[v]=i;
if(v==n+m+1)
found=true;
Q.push(v);
}
}
}
if(!found)
{
fout << flow << '\n';
for(int i=0; i<2*id; i+=2)
if(E[i].u>=1 && E[i].u<=n && E[i].v-n>=1 && E[i].v-n<=m && !E[i].cap)
fout << E[i].u << ' ' << E[i].v-n << '\n';
return 0;
}
int e=p[n+m+1], bn=inf;
while(e!=-1)
{
bn=min(bn, E[e].cap);
e=p[E[e].u];
}
flow+=bn;
e=p[n+m+1];
while(e!=-1)
{
E[e].cap-=bn;
E[E[e].rev].cap+=bn;
e=p[E[e].u];
}
}
return 0;
}