Pagini recente » Cod sursa (job #2287299) | Cod sursa (job #795528) | Cod sursa (job #947047) | Cod sursa (job #2190285) | Cod sursa (job #3333287)
#include <fstream>
#include <vector>
#include <queue>
using namespace std;
ifstream f("cuplaj.in");
ofstream g("cuplaj.out");
int L,R,m,x,y,n,S,T;
vector<vector<int>> flux;
vector<vector<int>> C;
vector<vector<int>> adj;
vector<int> tata;
bool gaseste_lant_nesaturat(){
queue<int> q;
vector<int> visited(n+2,0);
fill(tata.begin(), tata.end(), 0);
q.push(0);
tata[0] = 0;
visited[0] = 1;
while(!q.empty()){
int nod = q.front();
q.pop();
for(auto& neigh: adj[nod]){
if(visited[neigh] == 0 && C[nod][neigh] > flux[nod][neigh]){
q.push(neigh);
visited[neigh] = 1;
tata[neigh] = nod;
if(neigh == T){
return true;
}
}
if(visited[neigh] == 0 && flux[neigh][nod] > 0){
q.push(neigh);
visited[neigh] = 1;
tata[neigh] = -nod;
if(neigh == T){
return true;
}
}
}
}
return false;
}
int main(){
f >> L >> R >> m;
n = L + R;
S = 0;
T = n+1;
flux.assign(T + 1, vector<int>(T + 1, 0));
C.assign(T + 1, vector<int>(T + 1, 0));
adj.resize(n+2);
tata.resize(n+2);
for(int i=1; i<=m; i++){
f >> x >> y;
int nod_stanga = x;
int nod_dreapta = y+L;
if(C[S][nod_stanga] == 0){
adj[S].push_back(nod_stanga);
adj[nod_stanga].push_back(S);
C[S][nod_stanga] = 1;
}
adj[nod_stanga].push_back(nod_dreapta);
adj[nod_dreapta].push_back(nod_stanga);
C[nod_stanga][nod_dreapta] = 1;
if(C[nod_dreapta][T] == 0){
adj[nod_dreapta].push_back(T);
adj[T].push_back(nod_dreapta);
C[nod_dreapta][T] = 1;
}
}
int flux_maxim = 0;
while(gaseste_lant_nesaturat()){
for(int v = T; v!=S;){
int u = tata[v];
if(u >= 0){
flux[u][v] = 1;
v = u;
}
else{
int real_u = -u;
flux[v][real_u] = 0;
v = real_u;
}
}
flux_maxim += 1;
}
g << flux_maxim << '\n';
for(int i=1; i<=n; i++){
for(auto& neigh: adj[i]){
if(neigh > L && neigh <= L+R){
if(flux[i][neigh] == 1){
g << i << " " << neigh-L << "\n";
}
}
}
}
return 0;
}