Pagini recente » Cod sursa (job #642916) | Cod sursa (job #2202054) | Cod sursa (job #928231) | Cod sursa (job #534555) | Cod sursa (job #930588)
Cod sursa(job #930588)
#include <fstream>
#include <iostream>
#include <stdio.h>
#include <string.h>
using namespace std;
#define INF 2000000000
struct nod
{
int nr;
nod *next;
}*First[5005];
int N,M,E,S,F,Flow;
int Cap[5005][5005];
int Cost[5005][5005],T[5005];
void Insert(int x,int y)
{
nod *q=new nod;
q->nr=y;
q->next=First[x];
First[x]=q;
}
void Read()
{
ifstream fin("cuplaj.in");
fin>>N>>M>>E;
int i,x,y,y2;
S=N+M+1;
F=S+1;
for(i=1;i<=E;i++)
{
fin>>x>>y;
y2=y+N;
Cap[x][y2]=1;
Insert(x,y2);
Insert(y2,x);
}
for(i=1;i<=N;i++)
{
Cap[S][i]=1;
Insert(S,i);
Insert(i,S);
}
for(i=N+1;i<=N+M;i++)
{
Cap[i][F]=1;
Insert(F,i);
Insert(i,F);
}
fin.close();
}
int Road()
{
int c[E+5+N+M],cur,p,u,i;
memset(T,-1,sizeof(T));
T[S]=0;
p=u=1;
c[p]=S;
nod *q;
for(;p<=u;p++)
{
cur=c[p];
for(q=First[cur];q;q=q->next)
{
i=q->nr;
if(Cap[cur][i]-Cost[cur][i]>0&&T[i]==-1)
{
T[i]=cur;
u++;
c[u]=i;
if(i==F)
return 1;
}
}
}
return 0;
}
void Solve(int k,int &min)
{
if(T[k]!=0)
{
if(Cap[T[k]][k]-Cost[T[k]][k]<min&&Cap[T[k]][k]-Cost[T[k]][k]>0)
{
min=Cap[T[k]][k]-Cost[T[k]][k];
}
Solve(T[k],min);
Cost[T[k]][k]+=min;
Cost[k][T[k]]-=min;
}
}
int Resolve()
{
int sw=Road(),min,flow=0;
while(sw)
{
min=INF;
Solve(F,min);
flow+=min;
sw=Road();
}
return flow;
}
void write(int t[10005][10005])
{
int i,j;
for(i=1;i<=F;i++)
{
for(j=1;j<=F;j++)
printf("%d ",t[i][j]);
printf("\n");
}
}
void Write()
{
ofstream fout("cuplaj.out");
int i,j;
fout<<Flow<<'\n';
for(i=1;i<=N&&Flow>0;i++)
{
for(j=N+1;j<S;j++)
{
if(Cost[i][j]==1)
{
fout<<i<<' '<<j-N<<'\n';
Flow--;
break;
}
}
}
fout.close();
}
int main()
{
Read();
Flow=Resolve();
Write();
return 0;
}