Cod sursa(job #2027472)

Utilizator moise_alexandruMoise Alexandru moise_alexandru Data 26 septembrie 2017 09:50:58
Problema Ubuntzei Scor 20
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.73 kb
#include <iostream>
#include <fstream>
#include <queue>
using namespace std;
ifstream in("ubuntzei.in");
ofstream out("ubuntzei.out");
const int maxn = 2005;
int dp[maxn][(1 << 16)];
int poz[20];

class cmp {
public:
    bool operator()( pair<int, int> a, pair<int, int> b ) {
        return a.second > b.second;
    }
}; priority_queue<pair<int, int>, vector< pair<int, int> >, cmp> pq;

vector <pair <int, int> > v[maxn];

int get(int conf, int x)
{
    if(poz[x] == 0)
        return conf;
    if(conf & (1 << poz[x]))
        return conf;
    return conf + (1 << poz[x]);
}

int main()
{
    int n, m, k;
    in >> n >> m >> k;
    for(int i = 1; i <= k; i++)
    {
        int x;
        in >> x;
        poz[x] = i;
    }
    for(int i = 1; i <= m; i++)
    {
        int x, y, cost;
        in >> x >> y >> cost;
        v[x].push_back(make_pair(y, cost));
        v[y].push_back(make_pair(x, cost));
    }
    for(int i = 0; i <= n; i++)
        for(int j = 0; j <= (1 << k); j++)
            dp[i][j] = (1 << 30);
    pq.push(make_pair(1, 0));
    dp[1][0] = 0;
    while(!pq.empty())
    {
        pair<int, int> p = pq.top();
        cerr << p.first << " ";
        pq.pop();
        for(auto it : v[p.first])
        {
            for(int i = 0; i < (1 << k); i++)
            {
                int nod = it.first;
                int cost = it.second;
                int nou = get(i, nod);
                if(dp[nod][i] > dp[p.first][nou] + cost)
                {
                    dp[nod][i] = dp[p.first][nou] + cost;
                    pq.push(make_pair(nod, dp[nod][nou]));
                }
            }
        }
    }
    out << dp[n][(1 << k) - 1] << "\n";
    return 0;
}