Pagini recente » Cod sursa (job #2849148) | Cod sursa (job #851312) | Cod sursa (job #716592) | Cod sursa (job #687423) | Cod sursa (job #3348037)
#include <iostream>
#include <fstream>
#include <vector>
#include <queue>
#define ll long long int
using namespace std;
ifstream fin ("cuplaj.in");
ofstream fout("cuplaj .out");
int n, m, t, e;
struct edge{
int to;
ll maxf;
ll used;
int rev;
};
vector<vector<edge> > v;
vector<int> level, ptr;
void add_edge(int nod1, int nod2, ll cost)
{
v[nod1].push_back({nod2,cost,0,(int)v[nod2].size()});
v[nod2].push_back({nod1,0,0,(int)v[nod1].size()-1});
}
bool bfs(int start, int fin)
{
fill(level.begin(),level.end(),-1);
queue<int> q;
q.push(start);
level[start] = 0;
while(!q.empty())
{
int nod = q.front(); q.pop();
for(int i = 0; i<v[nod].size(); i++)
{
int vecin = v[nod][i].to;
ll maxf = v[nod][i].maxf;
ll used = v[nod][i].used;
if(maxf-used > 0 && level[vecin] == -1)
{
level[vecin] = level[nod] + 1;
q.push(vecin);
}
}
}
return level[fin] != -1;
}
ll dfs(int nod, int fin, ll flowc)
{
if(flowc == 0 || nod == fin)
return flowc;
for(int &i = ptr[nod]; i<v[nod].size(); i++)
{
int vecin = v[nod][i].to;
ll maxf = v[nod][i].maxf;
ll used = v[nod][i].used;
if(maxf - used == 0 || level[vecin] != level[nod] + 1)
continue;
ll pushedc = dfs(vecin, fin, min(flowc, maxf - used));
if(pushedc == 0) continue;
v[nod][i].used+=pushedc;
int revind = v[nod][i].rev;
v[vecin][revind].used-=pushedc;
return pushedc;
}
level[nod] = -1;
return 0;
}
int main()
{
fin >> n >> m >> e;
t = n+m+1;
v.resize(t + 1);
level.resize(t + 1);
ptr.resize(t +1);
for(int i = 1; i<=n; i++) add_edge(0,i,1);
for(int i = 1; i<=m; i++) add_edge(i+n,t,1);
for(int i = 1; i<=e; i++)
{
int a, b;
ll c;
fin >> a >> b;
add_edge(a,b+n,1);
}
ll ans = 0;
while(bfs(0,t))
{
fill(ptr.begin(), ptr.end(), 0);
ll pushed = 0;
ll inf = 1e18;
while(pushed = dfs(0,t,inf))
{
ans+=pushed;
}
}
fout << ans << '\n';
for(int i = 1; i<=n; i++)
{
for(auto e:v[i])
{
if(e.used == 1 && e.to>=n+1 && e.to<=n+m)
fout << i << ' ' << e.to-n <<'\n';
}
}
return 0;
}