Cod sursa(job #2971571)

Utilizator RobertlelRobert Robertlel Data 27 ianuarie 2023 17:15:32
Problema Cuplaj maxim de cost minim Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.92 kb
#include <bits/stdc++.h>
using namespace std;

ifstream f ("cmcm.in");
ofstream g ("cmcm.out");

int src = 0 , dst = 0 , n , m , x , y , c , e , cnt = 0;

int viz[750] , tata[750]  , cap[750][750] , cost[750][750];

vector < pair <int , int> > v[750];
vector <int> dist;

int dij ()
{
    memset (viz , 0 , sizeof (viz));
    memset (tata , 0 , sizeof (tata));
    dist.assign (n + m + 5 , INT_MAX);
    queue <int>coada;
    coada.push (src);
    viz[src] = 1;
    tata[src] = 0;
    dist[src] = 0;
    while (!coada.empty ())
    {
        int nod = coada.front ();
        viz[nod] = 0;
        coada.pop ();
        for (int i = 0 ; i < v[nod].size () ; i++)
        {
            int vecin = v[nod][i].first;
            if (cap[nod][vecin] > 0 && dist[vecin] > dist[nod] + cost[nod][vecin])
            {
                dist[vecin] = dist[nod] + cost[nod][vecin];
                tata[vecin] = nod;
                if (viz[vecin] == 0)
                {
                    viz[vecin] = 1;
                    coada.push (vecin);
                }

            }
        }
    }
    return dist[dst];
}

int flux ()
{
    int flow  , maxflow = 0;
    while (true)
    {
       int  suma = dij ();
        if (suma == INT_MAX)
            break;
        flow = INT_MAX;
        for (int j = dst ; j != src ; j = tata[j])
            flow = min (flow , cap[tata[j]][j]);

        for (int j = dst ; j != src ; j = tata[j])
        {
            cap[tata[j]][j] -= flow;
            cap[j][tata[j]] += flow;
        }
        maxflow += flow * suma;
    }
    return maxflow;

}

int main()
{
    f >> n >> m >> e;
     src = 0;
     dst = n + m + 1;
    for (int i = 1 ; i <= e ; i++)
    {
        f >> x >> y >> c;
        v[x].push_back (make_pair (y + n , i));
        v[y + n].push_back  (make_pair (x , i));
        cap[x][y + n] = 1;
        cost[x][y + n] = c;
        cost[y + n][x] = -c;
    }

    for (int i = 1 ; i <= n ; i++)
    {
        v[0].push_back (make_pair (i , 0));
        v[i].push_back (make_pair (0 , 0));
        cap[0][i] = 1;
    }
    for (int i = 1 ; i <= m ; i++)
    {
        v[i + n].push_back (make_pair (dst , 0));
        v[dst].push_back (make_pair (i + n , 0));
        cap[i + n][dst] = 1;
    }

    int aux =  flux ();
    for (int i = 1 ; i <= n + m ; i++)
    {
        for (int j = 0 ; j < v[i].size () ; j++)
        {
            int vecin = v[i][j].first;
            if (cap[i][vecin] == 0 && vecin != src && vecin != dst && i < vecin)
                cnt++;
        }
    }
    g << cnt << " " << aux << '\n';;
    for (int i = 1 ; i <= n + m ; i++)
    {
        for (int j = 0 ; j < v[i].size () ; j++)
        {
            int vecin = v[i][j].first;
            if (cap[i][vecin] == 0 && vecin != src && vecin != dst && i < vecin)
                g << v[i][j].second <<" ";
        }
    }
    return 0;
}