Pagini recente » Cod sursa (job #2075103) | Cod sursa (job #413806) | Cod sursa (job #2246673) | Cod sursa (job #734127) | Cod sursa (job #3163681)
///Alexandru Morus
#include <bits/stdc++.h>
using namespace std;
ifstream in("cuplaj.in");
ofstream out ("cuplaj.out");
vector<int> g[10009];
int flux[10001][10001],tata[10001],n,m;
int dennnis[10008],daddy[10008];
bool bfs()
{
int vf[2000] = {0};
queue<pair<int,int>> Q;
vf[0] = 1;
tata[0] = 0;
Q.push({0,9999999});
while(!Q.empty())
{
int nod = Q.front().first;
int val = Q.front().second;
Q.pop();
for(auto i : g[nod])
{
if(!vf[i] && flux[nod][i])
{
tata[i] = nod;
vf[i] = 1;
Q.push({i,min(val,flux[nod][i])});
if(i == n + m + 1)
{
return 1;
}
}
}
}
return 0;
}
int main()
{
int i,a,b,c,af = 0,j;
in >> n >> m >> c;
for(i = 1; i <= c; i ++)
{
in >> a >> b;
g[a].push_back(n + b);
g[n + b].push_back(a);
flux[a][n + b] = 1;
dennnis[i] = a;
daddy[i] = b;
}
for(i = 1; i <= n; i ++)
{
flux[0][i] = 1;
g[0].push_back(i);
g[i].push_back(0);
}
for(i = 1; i <= m; i ++)
{
g[i + n].push_back(n + m + 1);
g[n + m + 1].push_back(i + n);
flux[i + n][n + m + 1] = 1;
}
while(bfs())
{
int minim = 999999999;
for(i = n + m + 1; i != 0; i = tata[i])
{
minim = min(minim,flux[tata[i]][i]);
}
for(i = n + m + 1; i != 0; i = tata[i])
{
flux[i][tata[i]] += minim;
flux[tata[i]][i] -= minim;
}
af += minim;
}
out << af << '\n';
for(i = 1; i <= c; i ++)
{
if(flux[dennnis[i]][n + daddy[i]] == 0)
{
out << dennnis[i] << ' ' << daddy[i] << '\n';
}
}
return 0;
}