Cod sursa(job #3372099)

Utilizator ztefanDenciu Stefan ztefan Data 2 noiembrie 2026 14:59:56
Problema Sate Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.15 kb
#include <iostream>
#include <vector>
#include <array>
#include <fstream>

struct Road{
    int destination_village=0;
    int distance=0;
};

class Solution{
    int village_count,road_count;
    int start_village,end_village;
    std::vector<std::vector<Road>> roads;
    std::vector<bool> visited;
    std::istream& input;
    std::ostream& output;
    int final_distance=0;

    void add_road(int first_village,int second_village,int distance){
        roads[first_village].push_back({second_village,distance});
        roads[second_village].push_back({first_village,distance});
    }
public:
    Solution(std::istream& input,std::ostream& output) : input(input), output(output){}
    void read(){
        input>>village_count>>road_count;
        input>>start_village>>end_village;
        roads.resize(village_count+1);
        visited.resize(village_count+1);
        for(int idx=0;idx<road_count;idx++){
            int first_village,second_village,distance;
            input>>first_village>>second_village>>distance;
            add_road(first_village,second_village,distance);
        }
    }
    void dfs(int curr_village,int curr_distance){
        if(curr_village == end_village){
            final_distance=curr_distance;
            return;
        }
        for(auto road:roads[curr_village]){
            int next_village=road.destination_village;
            int road_length=road.distance;
            if(visited[next_village]){
                continue;
            }
            visited[next_village]=true;
            bool is_previous_village=next_village<curr_village;
            if(is_previous_village){
                dfs(next_village,curr_distance-road_length);
            }else{
                dfs(next_village,curr_distance+road_length);
            }
        }
    }
    void run(){
        constexpr int initial_distance=0;
        dfs(start_village,initial_distance);
    }
    void print(){
        output<<final_distance;
    }
};

int main(){
    std::ifstream fin("sate.in");
    std::ofstream fout("sate.out");
    Solution sate(fin,fout);
    sate.read();
    sate.run();
    sate.print();
}