Mai intai trebuie sa te autentifici.
Cod sursa(job #325436)
Utilizator | Data | 20 iunie 2009 15:37:21 | |
---|---|---|---|
Problema | Flux maxim | Scor | 0 |
Compilator | cpp | Status | done |
Runda | Arhiva educationala | Marime | 1.74 kb |
#include <algorithm>
#include <stdio.h>
#include <deque>
#define MAX 512
#define pb push_back
using namespace std;
int n, m, s, d;
int tata[MAX];
int matCap[MAX][MAX], matFlux[MAX][MAX];
inline int bfsFlux(int source, int dest)
{
int ok = 0;
deque <int> queBfs;
memset(tata, 0, sizeof(tata));
for (queBfs.pb(source); !queBfs.empty(); queBfs.pop_front())
{
int nod = queBfs[0];
ok = (nod == dest)? 1 : ok;
for (int vecin = 1; vecin <= 502; vecin++)
if (!tata[vecin] && (matCap[nod][vecin] > matFlux[nod][vecin]))
{
queBfs.pb(vecin);
tata[vecin] = nod;
}
}
return ok;
}
inline int fluxMaxim(int source, int dest)
{
int flux = 0;
for (; bfsFlux(source, dest); )
for (int i = 1; i <= n; i++)
{
if (matCap[250 + i][dest] <= matFlux[250 + i][dest] || !tata[i])
continue;
int trans = matCap[250 + i][dest] - matFlux[250 + i][dest];
for (int j = 250 + i; j != source; j = tata[j])
trans = min(trans, matCap[tata[j]][j] - matFlux[tata[j]][j]);
matFlux[250 + i][dest] += trans;
matFlux[dest][250 + i] -= trans;
for (int j = 250 + i; j != source; j = tata[j])
{
matFlux[tata[j]][j] += trans;
matFlux[j][tata[j]] -= trans;
}
flux += trans;
}
return flux;
}
int main()
{
freopen("joc4.in", "r", stdin);
freopen("joc4.out", "w", stdout);
scanf("%d %d %d %d", &n, &m, &s, &d);
for (; m; m--)
{
int nod1, nod2;
scanf("%d %d", &nod1, &nod2);
matCap[250 + nod1][nod2]++;
}
for (int i = 1; i <= n; i++)
matCap[i][250 + i] = 1;
matCap[501][s] = matCap[250 + d][502] = matCap[s][250 + s] = matCap[d][250 + d] = 5000;
printf("%d\n", fluxMaxim(501, 502));
fclose(stdin);
fclose(stdout);
return 0;
}