Cod sursa(job #2853464)

Utilizator Codrin2005Codrin Radetchi Codrin2005 Data 20 februarie 2022 12:15:05
Problema Ubuntzei Scor 15
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.88 kb
#include <fstream>
#include <queue>

using namespace std;

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

int n, m, k, d[201], viz[101], f[101];
int const INF = 100001;

struct liste_de_adiacenta{
    int s[101], c[101];
}a[101];

priority_queue <pair<int, int>> q;

bool oras(int c)
{
    for (int i = 1; i<=k; i++)
    {
        if (f[i] == c)
            return true;
    }
    return false;
}

void dijkstra (int nod)
{
    bool p;
    for (int i = 1; i<=n; i++)
    {
        d[i] = INF;
    }
    viz[nod] = 1;
    d[nod] = 0;
    q.push({0, nod});
    while (!q.empty())
    {
        int x = q.top().second;
        viz[x] = 1;
        p = false;
        q.pop();
//        if (oras(x))
//        {
//            cout<<
//        }
        for (int i = 1; i<= a[x].s[0] && !p; i++)
        {
            int y = a[x].s[i];
            int cost = a[x].c[i];
            if (d[y] > d[x] + cost)
            {
                d[y] = d[x] + cost;
            }
            if (!viz[y])
            {
                if (oras(y))
                {
                    while (!q.empty())
                        q.pop();
                    for (int i = 1; i<=n; i++)
                    {
                        viz[i] = 0;
                        if (i != y)
                            d[i] = INF;
                    }
                    p = true;
                }
                q.push({-d[y], y});
            }
        }
    }
}

int main()
{
    cin>>n>>m>>k;
    for (int i = 1; i<=k; i++)
    {
        cin>>f[i];
    }
    for (int i = 1; i<=m; i++)
    {
        int x, y, cost;
        cin>>x>>y>>cost;
        a[x].s[++a[x].s[0]] = y;
        a[x].c[a[x].s[0]] = cost;
        a[y].s[++a[y].s[0]] = x;
        a[y].c[a[y].s[0]] = cost;
    }
    dijkstra(1);
    cout<<d[n];
    return 0;
}