Cod sursa(job #1138696)

Utilizator FlameingoAiordachioaei Marius Flameingo Data 10 martie 2014 14:34:08
Problema Cuplaj maxim de cost minim Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 2.08 kb
#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);

}