Pagini recente » Cod sursa (job #677038) | Cod sursa (job #2078611) | Cod sursa (job #1998518) | Cod sursa (job #1751052) | Cod sursa (job #2695632)
#include <bits/stdc++.h>
using namespace std;
ifstream fin("cmcm.in");
ofstream fout("cmcm.out");
const int MAXN = 601, INF = 2e9;
int n, m, e, d;
int nr, min_cost;
vector<int> adj[MAXN];
int cost[MAXN][MAXN], c[MAXN][MAXN], edges[MAXN][MAXN], dst[MAXN], par[MAXN];
bool inQ[MAXN];
queue<int> qu;
bool BellmanFord()
{
for (int i = 1; i < MAXN; ++i)
dst[i] = INF;
dst[0] = 0;
qu.push(0);
inQ[0] = true;
while (!qu.empty())
{
int node = qu.front();
inQ[node] = false;
qu.pop();
for (auto nbh : adj[node])
if (c[node][nbh] && dst[nbh] > dst[node] + cost[node][nbh])
{
dst[nbh] = dst[node] + cost[node][nbh];
par[nbh] = node;
if (!inQ[nbh])
{
qu.push(nbh);
inQ[nbh] = true;
}
}
}
return (dst[d] != INF);
}
void compute()
{
int minF, node;
while (BellmanFord())
{
minF = INF;
node = d;
while (node != 0)
{
minF = min(minF, c[par[node]][node]);
node = par[node];
}
nr += minF;
min_cost += minF * dst[d];
node = d;
while (node != 0)
{
c[par[node]][node] -= minF;
c[node][par[node]] += minF;
node = par[node];
}
}
}
int main()
{
fin >> n >> m >> e;
d = n + m + 1;
int P, qu, cst;
for (int i = 1; i <= e; ++i)
{
fin >> P >> qu >> cst;
qu += n;
edges[P][qu] = i;
adj[P].push_back(qu);
adj[qu].push_back(P);
cost[P][qu] = cst;
cost[qu][P] = -cst;
c[P][qu] = 1;
}
for (int i = 1; i <= n; ++i)
{
adj[0].push_back(i);
adj[i].push_back(0);
c[0][i] = 1;
}
for (int i = n + 1; i <= m + n; ++i)
{
adj[i].push_back(d);
adj[d].push_back(i);
c[i][d] = 1;
}
compute();
fout << nr << ' ' << min_cost << '\n';
for (int i = 1; i <= n; ++i)
for (int j = n + 1; j <= m + n; ++j)
if (!c[i][j] && edges[i][j])
fout << edges[i][j] << " ";
return 0;
}