Pagini recente » Cod sursa (job #3037902) | Cod sursa (job #2901825) | Cod sursa (job #1699051) | Cod sursa (job #112518) | Cod sursa (job #2624464)
#include <fstream>
#include <vector>
#include <queue>
using namespace std;
ifstream cin("cuplaj.in");
ofstream cout("cuplaj.out");
const int lim=1e3+5;
vector<int> vec[lim];
int c[lim][lim];
int p[lim][lim];
int pred[lim];
queue<int> q;
int main()
{
int n,m,e,x,y;
cin>>n>>m>>e;
for(int i=1;i<=e;++i)
{
cin>>x>>y;
vec[x].push_back(y+n); vec[y+n].push_back(x);
c[x][y+n]=1;
p[x][y+n]=1;
}
for(int i=1;i<=n;++i)
{
vec[i].push_back(0); vec[0].push_back(i);
c[0][i]=1;
}
for(int i=n+1;i<=n+m;++i)
{
vec[i].push_back(m+n+1); vec[m+n+1].push_back(i);
c[i][m+n+1]=1;
}
int flow=0,ads;
do
{
for(int i=1;i<=m+n+1;++i)
pred[i]=0;
pred[0]=-1;
q.push(0);
while(!q.empty())
{
int x=q.front();
q.pop();
for(auto y:vec[x])
if(pred[y]==0 and c[x][y]>0)
{
pred[y]=x;
q.push(y);
}
}
if(pred[m+n+1])
for(int i=n+1;i<=n+m;++i)
if(pred[i])
{
ads=c[i][n+m+1];
for(int k=i;pred[k]>0;k=pred[k])
ads=min(ads,c[pred[k]][k]);
if(ads==0) continue;
c[i][n+m+1]-=ads,c[m+n+1][i]+=ads;
for(int k=i;pred[k]>0;k=pred[k])
c[pred[k]][k]-=ads,c[k][pred[k]]+=ads;
flow+=ads;
}
}while(pred[m+n+1]);
cout<<flow<<'\n';
for(int i=1;i<=n;++i)
for(int j=n+1;j<=n+m;++j)
if(c[i][j]!=1 and p[i][j]==1)
{
cout<<i<<' '<<j-n<<'\n';
break;
}
return 0;
}