Cod sursa(job #2046257)

Utilizator tifui.alexandruTifui Ioan Alexandru tifui.alexandru Data 23 octombrie 2017 17:16:14
Problema Cuplaj maxim de cost minim Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 2.34 kb
#include <bits/stdc++.h>
#define Nmax 639
#define INF INT_MAX
using namespace std;
ifstream f("cmcm.in");
ofstream g("cmcm.out");
int N,M,beginning,ending,x,y,cap,c,minimum,solution,d,E;
int capacity[Nmax][Nmax],flow[Nmax][Nmax],cost[Nmax][Nmax];
int T[Nmax],D[Nmax],muchii[Nmax][Nmax],flux;
vector <int> L[Nmax];
bitset <Nmax> inq;
queue <int> q;
bool bellman_ford()
{
    for(int i=1;i<=d;i++)
    {
        D[i]=INF;
        inq[i]=false;
    }
    D[0]=0;
    q.push(0);
    while(!q.empty())
    {
        int node=q.front();
        inq[node]=0;
        q.pop();
        for(int i=0;i<L[node].size();i++)
        {
            int neighbour=L[node][i];
            if((D[neighbour]>D[node]+cost[node][neighbour]) and (flow[node][neighbour]<capacity[node][neighbour]))
            {
                D[neighbour]=D[node]+cost[node][neighbour];
                T[neighbour]=node;
                if(!inq[neighbour])
                {
                    q.push(neighbour);
                    inq[neighbour]=true;
                }
            }
        }
    }
    return D[d]!=INF;
}
int main()
{
    f>>N>>M>>E;
    for(int i=1;i<=E;i++)
    {
        f>>x>>y>>c;
        L[x].push_back(N+y);
        L[N+y].push_back(x);
        capacity[x][N+y]=1;
        cost[x][N+y]=c;
        cost[N+y][x]=-c;
        muchii[x][N+y]=i;
    }
    for(int i=1;i<=N;i++)
    {
        capacity[0][i]=1;
        cost[0][i]=cost[i][0]=0;
        L[0].push_back(i);
        L[i].push_back(0);
    }
    d=N+M+1;
    for(int i=1;i<=M;i++)
    {
        capacity[N+i][d]=1;
        cost[N+i][d]=cost[d][N+1]=0;
        L[N+i].push_back(d);
        L[d].push_back(N+i);
    }
    while(bellman_ford())
    {
        minimum=INF;
        int x=d;

        while(x)
        {
            if(minimum>capacity[T[x]][x]-flow[T[x]][x])
                minimum=capacity[T[x]][x]-flow[T[x]][x];
            x=T[x];
        }
        x=d;
        while(x)
        {
            solution+=minimum*cost[T[x]][x];
            flow[T[x]][x]+=minimum;
            flow[x][T[x]]-=minimum;
            x=T[x];
        }
        flux+=minimum;
    }
    g<<flux<<' '<<solution<<'\n';
    for(int i=1;i<=N;i++)
        for(int j=N+1;j<=N+M;j++)
            if(flow[i][j]==1)
                g<<muchii[i][j]<<' ';

    return 0;
}