Pagini recente » Cod sursa (job #2746959) | Cod sursa (job #1905638) | Cod sursa (job #381114) | Cod sursa (job #1798554) | Cod sursa (job #2962283)
#include <bits/stdc++.h>
using namespace std;
ifstream f("cuplaj.in");
ofstream g("cuplaj.out");
int n, m, e, mxflow;
int viz[1005];
int tata[1005];
int flux[1005][1005], c[1005][1005];
vector <int> adjlist[1005];
bool modifiedBfs(int finish)
{
for(int i = 0; i <= 2*n+1; i++)
viz[i]=0,tata[i]=0;
int nod=0;
queue <int> Q;
Q.push(nod);
viz[nod] = 1;
tata[0] = -1;
while(!Q.empty())
{
nod = Q.front();
Q.pop();
for(int i=0;i<adjlist[nod].size();i++)
{
int vecin=adjlist[nod][i];
if(viz[vecin]!=1 && c[nod][vecin] - flux[nod][vecin] > 0)
{
viz[vecin] = 1;
tata[vecin] = nod;
Q.push(vecin);
}
}
}
if(!tata[finish])
return false;
int start=0;
for(int i=0;i<adjlist[finish].size();i++)
{
int vecin=adjlist[finish][i];
if(c[vecin][finish] - flux[vecin][finish] > 0)
{
int maxFlowLant = c[vecin][finish] - flux[vecin][finish];
for(int j = vecin; j != start; j = tata[j])
{
maxFlowLant = min(maxFlowLant, c[tata[j]][j] - flux[tata[j]][j]);
}
flux[vecin][finish] += maxFlowLant;
flux[finish][vecin] -= maxFlowLant;
for(int j = vecin; j != start; j = tata[j]){
flux[tata[j]][j] += maxFlowLant;
flux[j][tata[j]] -= maxFlowLant;
}
mxflow += maxFlowLant;
}
}
return true;
}
int main()
{
f>>n>>m>>e;
int start=0, finish=n+m+1;
int x, y;
for(int i = 1; i <= e; i++)
{
f>>x>>y;
y+=n;
adjlist[x].push_back(y);
adjlist[y].push_back(x);
c[x][y] = 1;
c[start][x]=1;
c[y][finish]=1;
adjlist[start].push_back(x);
adjlist[x].push_back(start);
adjlist[finish].push_back(y);
adjlist[y].push_back(finish);
}
while(modifiedBfs(finish)==true)
{
modifiedBfs(finish);
}
cout<<mxflow<<endl;
for(int i=1;i<=n;i++)
for(int j=n+1;j<=n+m;j++)
if(flux[i][j]==1)
cout<<i<<" "<<j-n<<'\n';
return 0;
}