Cod sursa(job #3186077)

Utilizator fabian_anghelFabian Anghel fabian_anghel Data 21 decembrie 2023 13:09:51
Problema Cc Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.11 kb
#include <fstream>
#include <queue>
using namespace std;
int N,cost[202][202],cap[202][202],parent[202],dist[202],flow,mincost;
ifstream f ("cc.in");
ofstream g ("cc.out");
void bfs()
{
    for(int i=1;i<=2*N+1;i++)
    {
        parent[i]=-1;
        dist[i]=1e9;
    }
    dist[0]=0;
    parent[0]=-1;
    deque<int> q;
    q.push_back(0);
    while(!q.empty())
    {
        int k=q.front();
        q.pop_front();
        if(k<=N && k>=1)
        {
            for(int i=N+1;i<=2*N;i++)
                if(cap[k][i]>0 && dist[i]>dist[k]+cost[k][i])
                {
                    parent[i]=k;
                    dist[i]=dist[k]+cost[k][i];
                    q.push_back(i);
                }
        }
        else if(k<=2*N)
        {
            for(int i=1;i<=N;i++)
                if(cap[k][i]>0 && dist[i]>dist[k]+cost[k][i])
                {
                    parent[i]=k;
                    dist[i]=dist[k]+cost[k][i];
                    q.push_back(i);
                }
            if(k!=0)
            {
                int i=2*N+1;
                if(cap[k][i]>0 && dist[i]>dist[k]+cost[k][i])
                {
                    parent[i]=k;
                    dist[i]=dist[k]+cost[k][i];
                    q.push_back(i);
                }
            }
        }
    }
}
int ford()
{
    mincost=0;
    while(dist[2*N+1]<1e9)
    {
        bfs();
        if(dist[2*N+1]==1e9)
            break;
        int poz=2*N+1;
        while(poz)
        {
            cap[parent[poz]][poz]-=1;
            cap[poz][parent[poz]]+=1;
            mincost+=cost[parent[poz]][poz];
            poz=parent[poz];
        }
    }
    return mincost;
}
int main()
{
    f>>N;
    for(int i=1;i<=N;i++)
        for(int j=N+1;j<=2*N;j++)
        {
            f>>cost[i][j];
            cost[j][i]=-cost[i][j];
            cap[i][j]=1;
        }
    for(int i=1;i<=N;i++)
    {
        cap[0][i]=1;
        cap[i+N][2*N+1]=1;
        cost[0][i]=0;
        cost[i+N][2*N+1]=0;
    }
    g<<ford();
    f.close();
    g.close();
    return 0;
}