Pagini recente » Cod sursa (job #1043854) | Cod sursa (job #1841223) | Cod sursa (job #1762905) | Cod sursa (job #1893701) | Cod sursa (job #2658862)
#include <bits/stdc++.h>
using namespace std;
ifstream fin("cuplaj.in");
ofstream fout("cuplaj.out");
const int NMAX = 20005;
int f[NMAX][NMAX],N,n,m,e,x,y,nod1,nod2,rasp;
bitset <NMAX> c[NMAX],ver;
int tata[NMAX],tata2[NMAX];
vector <int> v[NMAX];
queue <int> q;
bool bfs()
{
bool rasp=false;
for(int i=1;i<=NMAX;i++) ver[i]=0;
ver[0]=1;
q.push(0);
tata[0]=-1;
while(!q.empty()){
int nod=q.front();
q.pop();
for(int i=0;i<v[nod].size();i++){
int vecin=v[nod][i];
if(ver[vecin]==0 and c[nod][vecin]>f[nod][vecin]){
ver[vecin]=1;
q.push(vecin);
tata[vecin]=nod;
if(vecin==N)
rasp=true;
}
}
}
return rasp;
}
int main()
{
fin >> n >> m >> e;
N=2*n+1;
for(int i=1;i<=e;i++){
fin >> x >> y;
y+=n;
v[x].push_back(y);
v[y].push_back(x);
c[x][y]=1;
v[0].push_back(x);
v[x].push_back(0);
c[0][x]=1;
if(ver[y]==0) v[N].push_back(y);
ver[y]=1;
v[y].push_back(N);
c[y][N]=1;
}
while(bfs()==true){
for(int i=0;i<v[N].size();i++){
int nod=v[N][i];
if(ver[nod]==true and c[nod][N]>f[nod][N]){
int minim=c[nod][N]-f[nod][N];
int t=tata[nod];
while(t!=-1){
if(c[t][nod]-f[t][nod]<minim) minim=c[t][nod]-f[t][nod];
nod=t;
t=tata[t];
}
if(minim==0) continue;
rasp+=minim;
nod=N;
t=v[N][i];
while(t!=-1){
f[t][nod]+=minim;
f[nod][t]-=minim;
nod1=max(nod,t);
nod2=min(nod,t);
if(f[nod2][nod1]==1) tata2[nod1]=nod2;
nod=t;
t=tata[t];
}
}
}
}
fout << rasp << '\n';
for(int i=0;i<v[N].size();i++){
int nod=v[N][i];
if(f[nod][N]==1) fout << tata2[nod] << ' ' << nod-n << '\n';
}
return 0;
}