Pagini recente » Cod sursa (job #2598771) | Cod sursa (job #420463) | Cod sursa (job #2136553) | Cod sursa (job #656381) | Cod sursa (job #1613205)
#include <fstream>
#include <vector>
#include <queue>
#include <bitset>
#define DIM 305
#define INF (1 << 30)
using namespace std;
ifstream fin("cmcm.in");
ofstream fout("cmcm.out");
int D[2*DIM], T[2*DIM], cost[2*DIM][2*DIM], capacity[2*DIM][2*DIM], F[2*DIM][2*DIM], muchii[2*DIM][2*DIM];
int N, M, E, x, y, c, d, flux, solution, Fmin;
vector<int>L[2*DIM];
queue <int>Q;
bitset<2*DIM>v;
bool BF()
{
v.reset();
for(int i = 1; i <= N + M + 1; i ++)
{
D[i] = INF;
}
Q.push(0);
while(!Q.empty())
{
int nod = Q.front();
v[nod] = 0;
Q.pop();
for(int i = 0; i < L[nod].size(); i ++)
{
int vecin = L[nod][i];
if( (D[vecin] > D[nod] + cost[nod][vecin]) && (capacity[nod][vecin] > F[nod][vecin]) )
{
D[vecin] = D[nod] + cost[nod][vecin];
T[vecin] = nod;
if(v[vecin] == 0)
{
v[vecin] = 1;
Q.push(vecin);
}
}
}
}
return (D[d] != INF);
}
int main()
{
fin >> N >> M >> E;
for(int i = 1; i <= E; i ++)
{
fin >> x >> y >> c;
L[x].push_back(N + y);
L[N + y].push_back(x);
capacity[x][N + y] = 1;
cost[x][N + y] = c;
cost[N + y][x] = -c;
muchii[x][N + y] = i;
}
for(int i = 1; i <= N; i ++)
{
capacity[0][i] = 1;
L[0].push_back(i);
L[i].push_back(0);
}
for(int i = N + 1; i <= M + N; i ++)
{
capacity[i][N + M + 1] = 1;
L[i].push_back(N + M + 1);
L[N + M + 1].push_back(i);
}
d = N + M + 1;
while(BF())
{
x = d;
Fmin = INF;
while(x)
{
Fmin = min(Fmin, capacity[T[x]][x] - F[ T[x] ][x]);
x = T[x];
}
x = d;
while(x)
{
solution += Fmin * cost[ T[x] ][x];
F[T[x]][x] += Fmin;
F[x][T[x]] -= Fmin;
x = T[x];
}
flux += Fmin;
}
fout << flux << " " << solution << '\n';
for(int i = 1; i <= N; i ++)
{
for(int j = 1; j <= N + M; j ++)
{
if(F[i][j] == 1)
{
fout << muchii[i][j] << " ";
}
}
}
return 0;
}