Cod sursa(job #1473926)

Utilizator akaprosAna Kapros akapros Data 20 august 2015 15:05:00
Problema Ubuntzei Scor 25
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.08 kb
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <vector>
#include <queue>
#define maxN 2002
#define maxK 17
#define maxP 32770
#define inf 2000000000
using namespace std;
int n, N[maxP], m, p, i, j, k, c[maxK], f[maxN], d[maxN], dist[maxK][maxP];
vector < pair <int, int> > V[maxN];
queue < int > q[maxP];
void read()
{
    int x, y, z;
    freopen("ubuntzei.in", "r", stdin);
    scanf("%d %d", &n, &m);
    scanf("%d", &k);
    for (i = 1; i <= k; ++ i)
    {
        scanf("%d", &c[i]);
        f[c[i]] = i;
    }

    f[n] = ++ k;
    p = 1 << k;
    for (i = 1; i <= m; ++ i)
    {
        scanf("%d %d %d", &x, &y, &z);
        V[x].push_back(make_pair(y, z));
        V[y].push_back(make_pair(x, z));
    }
}
void solve()
{
    int x, node;
    for (i = 1; i <= k; ++ i)
        for (j = 0; j < p; ++ j)
            dist[i][j] = inf;

    q[0].push(1);
    for (j = 0; j < p; ++ j)
    {
        for (i = 1; i <= n; ++ i)
            d[i] = inf;

        if (j == 0)
            d[1] = 0;
        while (!q[j].empty())
    {
        x = q[j].front();
        if (f[x])
            d[x] = dist[f[x]][j];
        q[j].pop();
        for (i = 0; i < V[x].size(); ++ i)
            {
                node = V[x][i].first;
                if (!f[node])
                {
                    if (d[node] > d[x] + V[x][i].second)
                    {
                        d[node] = d[x] + V[x][i].second;
                        q[j].push(node);
                    }
                }
                else
                {
                    int Pow = 1 << (f[node] - 1);
                    if (dist[f[node]][j + Pow] > d[x] + V[x][i].second)
                    {
                        dist[f[node]][j + Pow] = d[x] + V[x][i].second;
                        q[j + Pow].push(node);
                    }
                }

            }
    }
    }
}
void write()
{
    freopen("ubuntzei.out", "w", stdout);
    printf("%d", dist[k][p - 1]);
}
int main()
{
    read();
    solve();
    write();
    return 0;
}