Cod sursa(job #1837635)

Utilizator SolcanMihaiSolcan Mihai Andrei SolcanMihai Data 30 decembrie 2016 11:12:42
Problema Ubuntzei Scor 20
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.47 kb
#include <cstdio>
#include <vector>
#include <queue>

using namespace std;

int n, m;
vector<pair<int, int> > vecini[2005];
int viz[2005];
int muchiiObligatorii[20];
int k;

void citire()
{
    scanf("%d %d", &n, &m);

    scanf("%d", &k);

    for(int i = 0; i < k; i++)
    {
        scanf("%d", &muchiiObligatorii[i]);
        muchiiObligatorii[i]--;
    }

    int tmp1, tmp2, tmp3;

    for(int i = 0; i < m; i++)
    {
        scanf("%d %d %d", &tmp1, &tmp2, &tmp3);
        tmp1--;
        tmp2--;
        vecini[tmp1].push_back(make_pair(tmp3, tmp2));
        vecini[tmp2].push_back(make_pair(tmp3, tmp1));
    }

    for(int i = 0; i < n; i++)
    {
        viz[i] = -1;
    }
}

//void solve1()
//{
//    priority_queue<pair<int, int>, vector<pair<int, int> >, greater<pair<int, int> > > Q;
//    Q.push(make_pair(0, 0));
//
//    while(!Q.empty())
//    {
//        int dest = Q.top().second;
//        int cost = Q.top().first;
//        Q.pop();
//
//        if(viz[dest] == -1 || viz[dest] > cost)
//        {
//            viz[dest] = cost;
//
//            int l = vecini[dest].size();
//
//            for(int i = 0; i < l; i++)
//            {
//                Q.push(make_pair(cost + vecini[dest][i].first, vecini[dest][i].second));
//            }
//        }
//    }
//
//    printf("%d", viz[n - 1]);
//}

int dist(int x, int y)
{
    for(int i = 0; i < n; i++)
    {
        viz[i] = -1;
    }

    priority_queue<pair<int, int>, vector<pair<int, int> >, greater<pair<int, int> > > Q;
    Q.push(make_pair(0, x));

    while(!Q.empty())
    {
        int dest = Q.top().second;
        int cost = Q.top().first;
        Q.pop();

        if(viz[dest] == -1 || viz[dest] > cost)
        {
            viz[dest] = cost;

            int l = vecini[dest].size();

            for(int i = 0; i < l; i++)
            {
                Q.push(make_pair(cost + vecini[dest][i].first, vecini[dest][i].second));
            }
        }
    }

    return viz[y];
}

int solve()
{
    if(k == 1)
    {
        return dist(0, muchiiObligatorii[0]) + dist(muchiiObligatorii[0], n - 1);
    }
    else
    {
        return dist(0, n - 1);
    }
}

int main()
{
    freopen("ubuntzei.in", "r", stdin);
    freopen("ubuntzei.out", "w", stdout);

    citire();

    if(k == 0)
    {
        printf("%d", dist(0, n - 1));
    }
    else
    {
        printf("%d", solve());
    }

    return 0;
}