Cod sursa(job #2209258)

Utilizator nicolaefilatNicolae Filat nicolaefilat Data 2 iunie 2018 15:50:47
Problema Sate Scor 60
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.59 kb
#include <iostream>
#include <fstream>
#include <queue>
#include <map>
#include <vector>
#define MAXN 30005

using namespace std;

ifstream in("sate.in");
ofstream out("sate.out");

int n,m,sat_inceput,sat_sfarsit,dp[MAXN];
bool viz[MAXN];
vector<int>graf[MAXN];
queue<int>stiva;
map<int,int>lungime[MAXN];

int bfs(){
    stiva.push(sat_inceput);
    viz[sat_inceput] = true;

    while(!stiva.empty()){
        int sat = stiva.front();
        stiva.pop();

        for(int i = 0; i < graf[sat].size(); i++){
            int sat_curent = graf[sat][i];
            if(!viz[sat_curent]){
                stiva.push(sat_curent);
                viz[sat_curent] = true;
                if(sat_curent != sat_inceput){
                    if(sat_curent >= sat)
                        dp[sat_curent] = dp[sat] + lungime[sat][sat_curent];
                    else if(sat_curent < sat)
                        dp[sat_curent] = dp[sat] - lungime[sat][sat_curent];
                    //cout<<"Distanta de la "<<sat_inceput<<" la "<<sat_curent<<" este : "<<dp[sat_curent]<<endl;
                }
            }

        }
    }
    return dp[sat_sfarsit];
}

int main()
{
    in.tie(NULL);
    out.tie(NULL);
    ios::sync_with_stdio(false);

    in>>n>>m>>sat_inceput>>sat_sfarsit;

    int sat1,sat2;
    for(int i = 1; i <= m; i++){
        int lung;
        in>>sat1>>sat2>>lung;
        lungime[sat1][sat2] = lung;
        lungime[sat2][sat1] = lung;
        graf[sat1].push_back(sat2);
        graf[sat2].push_back(sat1);
    }
    out<<bfs();


    return 0;
}