Cod sursa(job #2960925)

Utilizator PHOSSESSEDProsie Radu-Teodor PHOSSESSED Data 5 ianuarie 2023 12:47:53
Problema Cc Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.17 kb
#include<fstream>
#include<vector>
#include<queue>
#include<cstring>
#include<bitset>
using namespace std;

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

const int NMAX = 103;
const int DMAX = 2 * NMAX;
const int P = 1e2;
const int INF = 1e9;

vector<int> vecini[DMAX];

int cost[DMAX][DMAX],cap[DMAX][DMAX],t[2 * NMAX],flow[DMAX][DMAX];

int n,sink,finished,ans,out;

bitset<DMAX> inq;

void bf()
{
    vector<int> dp (DMAX,INF);
    memset(t,0,sizeof(t));
    dp[0] = 0;

    queue<int> q;
    inq.reset();
    q.push(0);

    while(!q.empty())
        {
            int v = q.front();
            q.pop(); inq[v] = 0;

            for(auto it : vecini[v])
                {
                    if((cap[v][it] - flow[v][it]) == 0) continue;
                    if(dp[v] + cost[v][it] < dp[it])
                        {
                            t[it] = v;
                            dp[it] = dp[v] + cost[v][it];
                            if(!inq[it])
                                q.push(it);
                        }
                }
        }

    if(dp[sink] == INF)
        {
            finished = 1;
            return;
        }


    for(int c = sink; c != 0 ; c = t[c])
        {
            flow[t[c]][c] += 1;
            flow[c][t[c]] -= 1;
        }

    ans += dp[sink];
}

void fmcm()
{
    while(!finished)
        bf();

    fout << ans;
    exit(0);
}

int main()
{
    int n; fin >> n;
    sink = 2 * NMAX - 1;

    for(int i = 1; i <= n ; i++)
        {
            for(int s = 1; s <= n ; s++)
                {
                   fin >> cost[i][s + P];
                   cap[i][s + P] = 1;
                   cap[s + P][sink] = 1;
                   cost[s + P][i] = -cost[i][s + P];
                   vecini[s + P].emplace_back(i);
                   vecini[i].emplace_back(s + P);

                }
        }

    for(int i = 1; i <= n ; i++)
        {
            vecini[0].emplace_back(i);
            cap[0][i] = 1;
            vecini[i + P].emplace_back(sink);
            vecini[i].emplace_back(0);
            vecini[sink].emplace_back(i + P);
        }
    fmcm();
}