Cod sursa(job #2566218)

Utilizator lucianul31Moisii Lucian lucianul31 Data 2 martie 2020 19:45:22
Problema Ubuntzei Scor 25
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.75 kb
#include <iostream>
#include <bits/stdc++.h>

using namespace std;

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

#define mp make_pair
const int NMAX=2005, Infinity=1<<29;
typedef pair < int, int > PAIR;
int n, m, K, Dist[NMAX], Friends[NMAX], iteration, COST;
vector < PAIR > Edge[NMAX];
bitset < NMAX > Seen, Viz;
priority_queue < pair < int, int > > Q;

void Read()
{
    int x, y, c;
    ios::sync_with_stdio(false);
    in.tie(NULL);
    in >> n >> m >> K;
    for(int i = 1; i <= K; i++)
        in >> Friends[i];
    for(int i = 1; i <= m; i++)
        in>> x >> y >> c, Edge[x].push_back(mp(y, c)), Edge[y].push_back(mp(x, c));
}
void Dijkstra(int x)
{
    Q.push(mp(0, x));
    while(!Q.empty())
    {
        x = Q.top().second;
        Q.pop();
        if(!Seen[x])
        {
            for(PAIR it : Edge[x])
                if(it.second + Dist[x] < Dist[it.first])
                    Dist[it.first] = Dist[x] + it.second, Q.push(mp(-Dist[it.first], it.first));
            Seen[x]=1;
        }
    }
}

int main()
{
    Read();
    int Position = 1;
    iteration = 1;
    int Min, p;
    while(iteration <= K)
    {
        for(int i = 1; i<=n; i++)
            Seen[i] = 0, Dist[i] = Infinity;
        Dist[Position] = 0;
        Dijkstra(Position);
        Min = Infinity;
        for(int i = 1; i<= K; i++)
            if(!Viz[Friends[i]] && Dist[Friends[i]] < Min)
                Min = Dist[Friends[i]], p = i;
        COST += Min;
        Viz[Friends[p]] = 1;
        iteration++;
        Position = Friends[p];
    }
    for(int i = 1; i<=n; i++)
        Seen[i] = 0, Dist[i] = Infinity;
    Dist[Position] = 0;
    Dijkstra(Position);
    out << COST + Dist[n];
    return 0;
}