Cod sursa(job #2571766)

Utilizator Tibi_SabauSabau Tiberiu Tibi_Sabau Data 5 martie 2020 10:04:14
Problema Ubuntzei Scor 20
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.65 kb
#include    <fstream>
#include    <vector>
#include    <queue>
#include    <algorithm>
using namespace std;
ifstream f("ubuntzei.in");
ofstream g("ubuntzei.out");
long long int n,m,k,vf[2005],dist[2005],distmin[2005];
const int oo=3000000;
vector<int>start;
vector<pair<int,int> >lv[2005];
struct cmp
{
    bool operator()(int a,int b)
    {
        return dist[a]>dist[b];
    }
};
priority_queue<int,vector<int>,cmp>q;
void dijkstra(int nod)
{
    fill(dist+1,dist+n+1,oo);
    fill(vf+1,vf+n+1,0);
    vf[nod]=1;
    dist[nod]=0;
    q.push(nod);
    while(!q.empty())
    {
        int actual=q.top();
        vf[actual]=0;
        q.pop();
        for(size_t j=0;j<lv[actual].size();j++)
        {
            int vecin=lv[actual][j].first;
            int cost=lv[actual][j].second;
            if(dist[actual]+cost<dist[vecin])
            {
                dist[vecin]=dist[actual]+cost;
                if(!vf[vecin])
                {
                    vf[vecin]=1;
                    q.push(vecin);
                }
            }
        }
    }
}
int main()
{
    f>>n>>m>>k;
    start.push_back(1);
    for(int i=1;i<=k;i++)
    {
        int x;
        f>>x;
        start.push_back(x);
    }
    start.push_back(n);
    for(int i=1;i<=m;i++)
    {
        int x,y,c;
        f>>x>>y>>c;
        lv[x].push_back(make_pair(y,c));
        lv[y].push_back(make_pair(x,c));
    }
    for(size_t j=0;j<start.size();j++)
    {
        int ns=start[j];
        dijkstra(ns);
        for(int i=1;i<=n;i++)
            distmin[i]+=dist[i];
    }
    g<<*min_element(distmin+1,distmin+n+1);
    return 0;
}