Pagini recente » Cod sursa (job #3155661) | Cod sursa (job #2595907) | Cod sursa (job #206454) | Cod sursa (job #2427889) | Cod sursa (job #2525676)
#include <bits/stdc++.h>
using namespace std;
vector<int> g[2005];
int c[10005][10005]={0}, f[10005][10005]={0};
int n, m;
int p[20005]={0};
bool viz[20005];
bool bfs(){
queue<int> q;
q.push(0);
memset(viz, false, sizeof(viz));
viz[0] = true;
while(!q.empty()){
int nod = q.front();
q.pop();
if(nod!=n)
for(int i=0; i<g[nod].size(); i++){
int adi = g[nod][i];
if(viz[adi] || f[nod][adi] == c[nod][adi])
continue;
viz[adi] = true;
q.push(adi);
p[adi] = nod;
}
}
if(viz[n])
return true;
return false;
}
int main()
{
int i, a, b, cmax, e;
ifstream _f("cuplaj.in");
ofstream _g("cuplaj.out");
_f >> n >> m >> e;
for(i=1; i<=e; i++){
_f >> a >> b;
b+=n;
g[a].push_back(b);
g[b].push_back(a);
c[a][b] = 1;
}
for(i=1; i<=n; i++){
g[0].push_back(i);
g[i].push_back(0);
c[0][i] = 1;
}
n+=m;
for(i=n-m+1; i<=n; i++){
g[n+1].push_back(i);
g[i].push_back(n+1);
c[i][n+1] = 1;
}
int flux, fmin;
n++;
for(flux=0; bfs();){
for(int j = 0; j< g[n].size(); j++){
fmin = 0x3f3f3f3f;
p[n] = g[n][j];
if(!viz[p[n]] || c[p[n]][n] == f[p[n]][n])
continue;
for(int nod = n; nod!=0; nod = p[nod]){
fmin = min(fmin, c[p[nod]][nod] - f[p[nod]][nod]);
}
for(int nod = n; nod!=0; nod = p[nod]){
f[p[nod]][nod] += fmin;
f[nod][p[nod]] -= fmin;
}
flux += fmin;
}
}
n--;
_g << flux << "\n";
for(int i=1; i<n-m+1; i++){
for(int j = 0; j<g[i].size(); j++)
if(f[i][g[i][j]] !=0 && g[i][j] != 0){
_g << i << " " << g[i][j] - (n-m) << "\n";
continue;
}
}
}