Cod sursa(job #1399902)

Utilizator chiriacandrei25Chiriac Andrei chiriacandrei25 Data 24 martie 2015 23:23:13
Problema Cuplaj maxim de cost minim Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 2.07 kb
#include <algorithm>
#include <cstdio>
#include <cstring>
#include <vector>
#include <bitset>
#include <queue>

using namespace std;

const int N=605, S=0, D=604, INF=0x3f3f3f3f;

vector <int> G[N];
bitset <N> v;
int C[N][N], F[N][N], Nr[N][N], Cost[N][N], Tr[N], dist[N];
int n, m, e, flow, flow_cost;

bool bellman_ford()
{
    int x, fmin, i;
    queue <int> Q;
    v.reset();
    memset(dist, INF, sizeof(dist));
    dist[S]=0;
    for(Q.push(S);!Q.empty();Q.pop())
    {
        x=Q.front();
        v[x]=0;
        for(vector<int>::iterator it=G[x].begin();it!=G[x].end();it++)
        {
            if(C[x][*it]==F[x][*it]) continue;
            if(dist[x]+Cost[x][*it]<dist[*it])
            {
                dist[*it]=dist[x]+Cost[x][*it];
                Tr[*it]=x;
                if(!v[*it])
                {
                    v[*it]=1;
                    Q.push(*it);
                }
            }
        }
    }
    if(dist[D]==INF) return false;
    fmin=INF;
    for(i=D;i!=S;i=Tr[i])
    {
        fmin=min(fmin, C[Tr[i]][i]-F[Tr[i]][i]);
    }
    for(i=D;i!=S;i=Tr[i])
    {
        F[Tr[i]][i]+=fmin;
        F[i][Tr[i]]-=fmin;
    }
    flow+=fmin;
    flow_cost+=fmin*dist[D];
    return true;
}

int main()
{
    freopen("cmcm.in", "r", stdin);
    freopen("cmcm.out", "w", stdout);
    int i, j, x, y, c;
    scanf("%d%d%d", &n, &m, &e);
    for(i=1;i<=e;i++)
    {
        scanf("%d%d%d", &x, &y, &c);
        y+=n;
        G[x].push_back(y);
        G[y].push_back(x);
        C[x][y]=1;
        Cost[x][y]=c;
        Cost[y][x]=-c;
        Nr[x][y]=i;
    }
    for(i=1;i<=n;i++)
    {
        G[S].push_back(i);
        G[i].push_back(S);
        C[S][i]=1;
    }
    for(i=n+1;i<=n+m;i++)
    {
        G[i].push_back(D);
        G[D].push_back(i);
        C[i][D]=1;
    }
    while(bellman_ford());
    printf("%d %d\n", flow, flow_cost);
    for(i=1;i<=n;i++)
    {
        for(j=n+1;j<=n+m;j++)
        {
            if(C[i][j]&&F[i][j]) printf("%d ", Nr[i][j]);
        }
    }
}