Cod sursa(job #3143397)

Utilizator alexddAlexandru Dima alexdd Data 29 iulie 2023 17:08:23
Problema Cc Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.9 kb
#include<bits/stdc++.h>
using namespace std;
ifstream fin("cc.in");
ofstream fout("cc.out");
const int INF = 1e9;
int n;
vector<int> con[205];
int capacity[205][205];
int cost[205][205];
int prec[205];
int dist[205];
void ford()
{
    for(int i=1;i<=2*n+2;i++)
    {
        prec[i]=0;
        dist[i]=INF;
    }
    dist[2*n+1]=0;
    prec[2*n+1]=-1;
    deque<int> dq;
    dq.push_back(2*n+1);
    while(!dq.empty())
    {
        int nod = dq.front();
        dq.pop_front();
        for(auto adj:con[nod])
        {
            if(capacity[nod][adj]>0 && dist[adj]>dist[nod]+cost[nod][adj])
            {
                prec[adj]=nod;
                dist[adj]=dist[nod]+cost[nod][adj];
                dq.push_back(adj);
            }
        }
    }
}
int maxflow_mincost()
{
    int flow=0,mincost=0;
    while(1)
    {
        ford();
        if(dist[2*n+2]==INF)
            break;
        int cur=2*n+2,mnm=INF;
        while(cur!=2*n+1)
        {
            mnm=min(mnm,capacity[prec[cur]][cur]);
            cur=prec[cur];
        }

        cur=2*n+2;
        while(cur!=2*n+1)
        {
            capacity[prec[cur]][cur]-=mnm;
            capacity[cur][prec[cur]]+=mnm;
            mincost+=cost[prec[cur]][cur];
            cur=prec[cur];
        }
        flow+=mnm;
    }
    return mincost;
}
signed main()
{
    fin>>n;
    for(int i=1;i<=n;i++)
    {
        con[2*n+1].push_back(i);
        //con[i].push_back(2*n+1);
        capacity[2*n+1][i]=1;

        con[i+n].push_back(2*n+2);
        //con[2*n+2].push_back(i+n);
        capacity[i+n][2*n+2]=1;
        for(int j=1;j<=n;j++)
        {
            fin>>cost[i][j+n];
            cost[j+n][i]=-cost[i][j+n];
            con[i].push_back(j+n);
            con[j+n].push_back(i);
            capacity[i][j+n]=1;
        }
    }
    fout<<maxflow_mincost();
    return 0;
}