Pagini recente » Cod sursa (job #1564306) | Cod sursa (job #2434333) | Cod sursa (job #1323086) | Cod sursa (job #2907740) | Cod sursa (job #3187697)
//
// 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;
}