Cod sursa(job #1955593)

Utilizator MithrilBratu Andrei Mithril Data 6 aprilie 2017 08:45:36
Problema Cuplaj maxim de cost minim Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 2.14 kb
#include <bits/stdc++.h>
#define NMAX 610
#define INF 2000000000
#define SRC 0
#define SINK n+m+1

using namespace std;

ifstream fin("cmcm.in");
ofstream fout("cmcm.out");

int n,m,s,d,ok,e;
vector<int> g[NMAX];
int f[NMAX][NMAX],c[NMAX][NMAX],cost[NMAX][NMAX],muchie[NMAX][NMAX];
int dist[NMAX],parent[NMAX];
bitset<NMAX> inQ;
queue<int> Q;

void read() {
    fin>>n>>m>>e;
    for(int i=1; i<=e; i++) {
        int x,y,w;
        fin>>x>>y>>w;
        g[x].push_back(y+n);
        g[y+n].push_back(x);
        c[x][y+n]=1;
        cost[x][y+n]=w;
        cost[y+n][x]=-w;
        muchie[x][y+n]=i;

    }
    for(int i=1; i<=n; i++) {
        g[SRC].push_back(i);
        g[i].push_back(SRC);
        c[SRC][i]=1;
    }
    for(int i=n+1; i<=n+m; i++) {
        g[i].push_back(SINK);
        g[SINK].push_back(i);
        c[i][SINK]=1;
    }
}

int bellman() {
    fill(dist+SRC,dist+SINK+1,INF);
    fill(parent+SRC,parent+SINK+1,INF);
    Q.push(SRC);
    inQ.reset();
    dist[SRC]=0;
    inQ[SRC]=1;

    for(; Q.size(); Q.pop()) {
        int aux=Q.front();
        inQ[aux]=0;

        for(auto q:g[aux]) {
            if(c[aux][q]-f[aux][q]>0&&dist[q]>dist[aux]+cost[aux][q]) {
                parent[q]=aux;
                dist[q]=dist[aux]+cost[aux][q];

                if(!inQ[q]) {
                    inQ[q]=1;
                    Q.push(q);

                }

            }

        }

    }

    if(dist[SINK]!=INF) {
        ok=1;
        for(int i=SINK; i!=SRC; i=parent[i]) {
            f[parent[i]][i]++;
            f[i][parent[i]]--;

        }
        return dist[SINK];
    }
    return 0;
}

int main() {
    read();
    ok=1;
    int64_t result=0;
    while(ok) {
        ok=0;
        result+=bellman();

    }
    int cuplaj=0;
    vector<int> selectedEdges;
    for(int i=1; i<=n; i++) for(auto q:g[i]) {
        if(q==SRC) continue;
        if(f[i][q])
        {
            cuplaj++;
            selectedEdges.push_back(muchie[i][q]);
        }
    }
    fout<<cuplaj<<' '<<result<<'\n';
    for(auto q:selectedEdges) fout<<q<<' ';
    return 0;
}