Pagini recente » Borderou de evaluare (job #2496594) | Borderou de evaluare (job #547434) | Borderou de evaluare (job #528964) | Cod sursa (job #3363488) | Cod sursa (job #3364297)
#include <bits/stdc++.h>
using namespace std;
struct edge{
int from,to,cap;
bool isR;
edge* rev;
edge(int f,int t,int c,bool b){
from=f;to=t;cap=c;
isR=b;
}
};
int inf=1000000000;
int nax;
class cDinic{
public:
int N;
vector<vector<edge*>> adj;
vector<int> lev;
void start(int n){
N=n;
adj.resize(N);
}
void addE(int a, int b, int cp, bool r){
edge* f = new edge(a,b,cp,r);
edge* bck = new edge(b,a,0,false);
f->rev = bck;
bck->rev = f;
adj[a].push_back(f);
adj[b].push_back(bck);
}
int S,T;
bool bfs(){
lev.assign(N, -1);
queue<int> q;
lev[S] = 0;
q.push(S);
while(!q.empty()){
int n = q.front(); q.pop();
for(auto e : adj[n]){
if(e->cap > 0 && lev[e->to] == -1){
lev[e->to] = lev[n] + 1;
q.push(e->to);
}
}
}
return lev[T] != -1;
}
int dfs(int n, int flow){
if(n == T) return flow;
for(auto e : adj[n]){
if(e->cap > 0 && lev[e->to] == lev[n] + 1){
int pushed = dfs(e->to, min(flow, e->cap));
if(pushed > 0){
e->cap -= pushed;
e->rev->cap += pushed;
return pushed;
}
}
}
return 0;
}
int maxF(int s, int t){
S=s; T=t;
int mxF = 0;
while(bfs()){
while(int pushed = dfs(S, inf)){
mxF += pushed;
}
}
return mxF;
}
void outG(){
for(int i=0;i<N;i++){
for(auto e: adj[i]){
if(e->isR && e->rev->cap>0){
cout<<e->from<<" "<<e->to-nax<<"\n";
}
}
}
}
};
int main(){
ios::sync_with_stdio(false);
cin.tie(nullptr);
freopen("cuplaj.in","r",stdin);
freopen("cuplaj.out","w",stdout);
int na, nb, M;
cin >> na >> nb >> M;
nax=na;
int S = 0;
int T = na + nb + 1;
cDinic g;
g.start(T + 1);
for(int a = 1; a <= na; a++)
g.addE(S, a, 1, false);
for(int b = 1; b <= nb; b++)
g.addE(na + b, T, 1, false);
for(int i = 0; i < M; i++){
int a, b;
cin >> a >> b;
b += na;
g.addE(a, b, 1, true);
}
int maxF = g.maxF(S, T);
cout << maxF << "\n";
g.outG();
}