Cod sursa(job #2387058)

Utilizator raduandreicaRadu Andreica raduandreica Data 24 martie 2019 11:49:23
Problema Sate Scor 45
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.66 kb
#include <iostream>
#include <fstream>
#include <vector>
#include <queue>
#include <map>
#include <algorithm>
using namespace std;

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

vector< vector <int> > g;
int n,m;
map<pair<int,int>, int> mp;

void citire()
{
    for(int i=0 ; i<m ; i++)
    {
        int a , b , c;
        fin >> a >> b >>c;
        g[a].push_back(b);
        g[b].push_back(a);
        mp[make_pair(a,b)] = c;
        mp[make_pair(b,a)] = c;
    }
}
vector <int> BFS(int s)
{
    vector <int> d(n+1,n);
    queue <int> q;
    d[s]=0;
    q.push(s);
    while(!q.empty())
    {
        int nod = q.front();
        q.pop();
        for(int i=0 ; i<g[nod].size() ; i++)
        {
            int vec = g[nod][i];
            if(d[vec]==n)
            {
                d[vec] = d[nod] +1;
                q.push(vec);
            }
        }
    }
    return d;
}
int main()
{
    int x,y;
    fin>>n>>m>>x>>y;
    if(x>y)
        swap(x,y);
    g = vector<vector<int > >(n + 1);
    citire();
    vector <int> xv = BFS(x);
    vector <int> yv = BFS(y);
    vector <int> bune;
    for(int i=1 ; i<=n ; i++)
    {
        if(xv[i]+yv[i] == xv[y])
            bune.push_back(i);
    }
    int drum[30010];
    drum[0] = x;
    drum[yv[x]] = y;
    for(int i=1 ; i<yv[x] ; i++)
    {
        for(int j=1 ; j<=n ; j++)
        {
            if(xv[j] == i && yv[j] == yv[x] - i && mp[make_pair(drum[i-1],j)])
                drum[i] = j;
        }
    }
    int ans = 0;
    for(int i=0 ; i<yv[x] ; i++)
    {
        if(drum[i]<drum[i+1])
            ans = ans + mp[make_pair(drum[i] , drum[i+1])];
        else ans = ans - mp[make_pair(drum[i] , drum[i+1])];
    }
    fout<<ans;
}