Pagini recente » Cod sursa (job #1779771) | Cod sursa (job #765278) | Cod sursa (job #1717337) | Cod sursa (job #2818767) | Cod sursa (job #3215657)
#include<fstream>
#include<stdio.h>
#include<vector>
#include<queue>
#include <cstring>
using namespace std;
int n,c[1000][1000],flux[1000][1000],tata[1000],viz[1000];
vector <int> N[1000];
ifstream f("cuplaj.in");
ofstream g("cuplaj.out");
int parcurg()
{
int i,p;
queue <int> q;
viz[0]=1;
q.push(0);
memset(viz,0,sizeof(viz));
while(q.size()>0)
{
p=q.front();
for(i=0;i<N[p].size();i++)
if((viz[N[p][i]]==0)&&(c[p][N[p][i]]>flux[p][N[p][i]]))
{
q.push(N[p][i]);
tata[N[p][i]]=p;
viz[N[p][i]]=1;
if(N[p][i]==2*n+1)
return 1;
}
q.pop();
}
return 0;
}
int main()
{
int l,ok=1,fluxt=0,i,j,k,nod,fmin1,card1,card2,m;
f >> card1 >> card2 >> m;
n=card1+card2;
for(l=1;l<=m;l++){
f >> k >> j;
c[k][j+n]=1;
c[j+n][k]=0;
N[k].push_back(j+n);
N[j+n].push_back(k);
}
for(i=1;i<=n;i++)
{
c[0][i]=1;
c[i][0]=0;
N[0].push_back(i);
N[i].push_back(0);
}
for(i=1;i<=n;i++)
{
c[i+n][2*n+1]=1;
c[2*n+1][i+n]=0;
N[i+n].push_back(2*n+1);
N[2*n+1].push_back(i+n);
}
while(ok)
{
ok=parcurg();
fmin1=100000;
for(nod=2*n+1;nod!=0;nod=tata[nod])
fmin1=min(fmin1,c[tata[nod]][nod]-flux[tata[nod]][nod]);
for(nod=2*n+1;nod!=0;nod=tata[nod])
{
flux[tata[nod]][nod]+=fmin1;
flux[nod][tata[nod]]-=fmin1;
}
fluxt+=fmin1;
}
g << fluxt << '\n';
for(i=1;i<=n;i++){
for(j=1;j<=2*n;j++){
if(flux[i][j]!=0){
g << i << " " << j-n << '\n';
}
}
}
}