Pagini recente » Cod sursa (job #391906) | Cod sursa (job #907676) | Cod sursa (job #317731) | Cod sursa (job #1106466) | Cod sursa (job #2670778)
#include <bits/stdc++.h>
using namespace std;
ifstream fin("cuplaj.in");
ofstream fout("cuplaj.out");
const int INF = (1<<29);
const int NMAX = 30005;
struct Muchie{
int a,b;
int capacitate;
int flux;
};
int N,n,m,e,x,y;
vector <Muchie> muchii;
vector <vector <int> > v;
vector <int> tata;
int tata2[NMAX];
bool bfs(){
queue<int> q;
q.push(0);
tata.assign(N+1,-1);
tata[0]=n+m+e;
while(!q.empty()){
int node=q.front();
q.pop();
if(node==N) continue;
for(int i:v[node]){
Muchie edge=muchii[i];
if(tata[edge.b]!=-1 or edge.capacitate==edge.flux)
continue;
tata[edge.b]=i;
q.push(edge.b);
}
}
return tata[N]!=-1;
}
int main()
{
fin >> n >> m >> e;
N=n+m+1;
muchii.resize(2*N+2*e+5);
v.resize(N+2,vector<int>());
for(int i=0;i<2*e;i+=2){
fin >> x >> y;
y+=n;
muchii[i].a=x;
muchii[i].b=y;
muchii[i].capacitate=1;
muchii[i+1].a=muchii[i].b;
muchii[i+1].b=muchii[i].a;
v[muchii[i].a].push_back(i);
v[muchii[i].b].push_back(i+1);
}
int ind=2*e;
for(int i=1;i<=n;i++){
muchii[ind].a=0;
muchii[ind].b=i;
muchii[ind].capacitate=1;
muchii[ind+1].a=muchii[ind].b;
muchii[ind+1].b=muchii[ind].a;
v[muchii[ind].a].push_back(ind);
v[muchii[ind].b].push_back(ind+1);
ind+=2;
}
for(int i=n+1;i<=n+m;i++){
muchii[ind].a=i;
muchii[ind].b=N;
muchii[ind].capacitate=1;
muchii[ind+1].a=muchii[ind].b;
muchii[ind+1].b=muchii[ind].a;
v[muchii[ind].a].push_back(ind);
v[muchii[ind].b].push_back(ind+1);
ind+=2;
}
int rasp=0;
while(bfs()){
for(int edge_from_dest_index : v[N]){
int edge_to_dest_index = edge_from_dest_index^1;
Muchie edge_to_dest = muchii[edge_to_dest_index];
if(tata[edge_to_dest.a]==-1 or edge_to_dest.flux == edge_to_dest.capacitate)
continue;
tata[N]=edge_to_dest_index;
int minim=INF;
for(int i=N;i!=0;i=muchii[tata[i]].a)
minim=min(minim,muchii[tata[i]].capacitate-muchii[tata[i]].flux);
if(minim==0) continue;
for(int i=N;i!=0;i=muchii[tata[i]].a){
muchii[tata[i]].flux+=minim;
muchii[tata[i]^1].flux-=minim;
if(muchii[tata[i]].a>muchii[tata[i]].b)
tata2[muchii[tata[i]].a]=muchii[tata[i]].b;
else tata2[muchii[tata[i]].b]=muchii[tata[i]].a;
}
rasp+=minim;
}
}
fout << rasp << '\n';
for(int i=0;i<v[N].size();i++){
int nod=muchii[v[N][i]].b;
if(muchii[v[N][i]^1].flux==1){
fout << tata2[nod] << ' ' << nod-n << '\n';
}
}
return 0;
}