Cod sursa(job #1862460)

Utilizator ClaudiuHHiticas Claudiu ClaudiuH Data 29 ianuarie 2017 22:52:52
Problema Ubuntzei Scor 100
Compilator cpp Status done
Runda becreative5 Marime 1.91 kb
#include <iostream>
#include <fstream>
#include <vector>
#include <cstring>
#include <queue>

using namespace std;
 
ifstream fin("ubuntzei.in");
ofstream fout("ubuntzei.out");
 
const int inf = 0x3f3f3f3f;
 
int n, m, k,len[17][17], dist[2005], dp[1 << 17][17];
vector <pair<int, int> > g[2005];
vector <int> s;
 
inline void dijkstra(int stnode) 
{
    priority_queue<pair<int, int> > q;
    
    memset(dist, inf, sizeof(dist));
    dist[stnode] = 0;
    q.push(make_pair(0, stnode));
    while(!q.empty()) {
        int node = q.top().second;
        int cost = -q.top().first;
        q.pop();
        if(dist[node] < cost)
            continue;
        for(auto it: g[node])
            if(dist[it.first] > cost + it.second) {
                dist[it.first] = cost + it.second;
                q.push(make_pair(-dist[it.first], it.first));
            }
    }
}
 
int main() 
{
    fin >> n >> m;
    fin >> k;
    s.push_back(0);
    
    for(int i = 1 ; i <= k ; ++ i) {
        int x;
        fin >> x;
        -- x;
        s.push_back(x);
    }
    s.push_back(n - 1);
    
    for(int i = 1 ; i <= m ; ++ i) 
    {
        int x, y, c;
        fin >> x >> y >> c;
        -- x;
        -- y;
        g[x].push_back(make_pair(y, c));
        g[y].push_back(make_pair(x, c));
    }
    
    for(size_t i = 0 ; i < s.size() ; ++ i) 
    {
        dijkstra(s[i]);
        for(size_t j = 0 ; j < s.size() ; ++ j)
            len[i][j] = dist[s[j]];
    }
    memset(dp, inf, sizeof(dp));
    dp[1][0] = 0;
    int maxmask = (1 << (s.size()));
    for(int mask = 1 ; mask < maxmask ; ++ mask) {
        for(size_t i = 0 ; i < s.size() ; ++ i)
            if(mask & (1 << i))
                for(size_t j = 0 ; j < s.size() ; ++ j)
                    if(mask & (1 << j))
                        dp[mask][i] = min(dp[mask][i], dp[mask ^ (1 << i)][j] + len[j][i]);
    }
    fout << dp[maxmask - 1][s.size() - 1] << '\n';
}
//Credits: floreaadrian