Cod sursa(job #3187697)

Utilizator HaiduculAndrei Popa Haiducul Data 30 decembrie 2023 10:04:26
Problema Cc Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.15 kb
//
// Created by Andrei on 29.12.2023.
//
#define INFINITE 0x3f3f3f3f
#include <bits/stdc++.h>
using namespace std;
ifstream f("cc.in");
ofstream g("cc.out");


vector<pair<int,int>> list_adj[202];
int nr_of_students;
int cost[202][202];
int actual_cost[202][202];
int fathers[202];
int distanta[202];
int ans;



void Read() {
    int dist;
    f>>nr_of_students;
    for(int i=1; i<=nr_of_students; i++){
        for(int j=1; j<=nr_of_students; j++){
            f>>dist;
            list_adj[i].push_back(make_pair(j+nr_of_students, dist));
            list_adj[j+nr_of_students].push_back(make_pair(i,-dist)) ;
            actual_cost[i][j+nr_of_students] = 1 ;
            cost[i][j+nr_of_students] = dist ;
            cost[j+nr_of_students][i] = -dist ;
        }
    }
    /// legam de nodul de start
    for ( int i = 1 ; i <= nr_of_students ; i++ ){
        list_adj[0].push_back(make_pair(i,0)) ;
        actual_cost[0][i] = 1 ;
    }
    /// legam de nodul de final
    for (int  i = nr_of_students+1 ; i <= 2*nr_of_students ; i++ )
    {
        list_adj[i].push_back(make_pair(2*nr_of_students+1,0)) ;
        actual_cost[i][2 * nr_of_students + 1] = 1 ;
    }
}

bool dijstra() {
    memset(fathers,0,sizeof(fathers)) ;
    memset(distanta,INFINITE,sizeof(distanta)) ;

    queue<int> que;
    que.push(0);
    distanta[0] = 0; //nod start
    while(!que.empty()){
        int nod_actual = que.front();
        que.pop();

        for ( auto vecin : list_adj[nod_actual] ){
            if(distanta[vecin.first] >distanta[nod_actual] + vecin.second) {
                if (actual_cost[nod_actual][vecin.first]) {
                    fathers[vecin.first] = nod_actual;
                    distanta[vecin.first] = distanta[nod_actual] + vecin.second;
                    que.push(vecin.first);
                }
            }
        }
    }

    if (distanta[2 * nr_of_students + 1] == INFINITE )
        return false;
    for (int i = 2 * nr_of_students + 1 ; i!=0 ; i=fathers[i] )
    {
        actual_cost[i][fathers[i]]++ ;
        actual_cost[fathers[i]][i]-- ;
        ans = ans+cost[fathers[i]][i] ;
    }
    return true ;
}
int main()
{   Read();
    while(dijstra());

    g<<ans;
}