Pagini recente » Cod sursa (job #2317069) | Cod sursa (job #2899040) | Cod sursa (job #2057000) | Cod sursa (job #1444296) | Cod sursa (job #1138696)
#include <cstdio>
#include <vector>
#include <queue>
#include <bitset>
#define son first
#define cost second
using namespace std;
typedef pair <int, int> graph_node;
const int NMAX = 603, INFI = 2e9;
vector <graph_node> G[NMAX];
vector <int> S;
queue <int> Q;
bitset <NMAX> cap[NMAX];
int N, M, ans, dist[NMAX], T[NMAX], edge_index[NMAX][NMAX];
inline bool bellman_ford () {
vector <graph_node> :: iterator i;
int node;
for (node = 1; node <= N + M + 1; ++node)
dist[node] = INFI;
for (Q.push (0); !Q.empty (); Q.pop ()) {
node = Q.front ();
for (i = G[node].begin (); i != G[node].end (); ++i)
if (cap[node][i->son] && dist[i->son] > dist[node] + i->cost) {
dist[i->son] = dist[node] + i->cost;
Q.push (i->son);
T[i->son] = node;
}
}
if (dist[N + M + 1] == INFI)
return 0;
ans += dist[N + M + 1];
for (node = N + M + 1; node; node = T[node]) {
cap[T[node]][node] = 0;
cap[node][T[node]] = 1;
}
return 1;
}
int main () {
freopen ("cmcm.in", "r", stdin);
freopen ("cmcm.out", "w", stdout);
vector <graph_node> :: iterator k;
int E, a, b, c, i;
scanf ("%d%d%d", &N, &M, &E);
for (i = 1; i <= E; ++i) {
scanf ("%d%d%d", &a, &b, &c);
G[a].push_back (make_pair (N + b, c));
G[N + b].push_back (make_pair (a, -c));
edge_index[a][b] = i;
cap[a][N + b] = 1;
}
for (i = 1; i <= N; ++i) {
G[0].push_back (make_pair(i, 0));
cap[0][i] = 1;
}
for (i = 1; i <= M; ++i) {
G[N + i].push_back (make_pair (N + M + 1, 0));
cap[N + i][N + M + 1] = 1;
}
while (bellman_ford ());
for (i = 1; i <= N; ++i)
for (k = G[i].begin (); k != G[i].end (); ++k)
if (!cap[i][k->son])
S.push_back (edge_index[i][k->son - N]);
printf ("%d %d\n", S.size (), ans);
for (vector <int> :: iterator j = S.begin (); j != S.end (); ++j)
printf ("%d ", *j);
}