Cod sursa(job #1515937)

Utilizator bogdanmarin69Bogdan Marin bogdanmarin69 Data 2 noiembrie 2015 14:47:26
Problema Ubuntzei Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.94 kb
#include <fstream>
#include <vector>
#include <queue>
using namespace std;
class cmp{
    public:
    bool operator() (pair<int, int> a,pair<int, int> b){
        return a.second>b.second;
    }
};
const int KMAX = 17, MAX = 2001, INF = (1<<30);
int n, m, k, dp[1<<KMAX][KMAX], id[MAX], pr[KMAX], cost[KMAX][KMAX], d[MAX];
vector <pair <int, int> > la[MAX];
priority_queue <pair<int, int>, vector<pair<int, int> >, cmp> q;
ifstream fin("ubuntzei.in");
ofstream fout("ubuntzei.out");
void dijkstra(int nod){
    for(int i=1; i<=n; i++) d[i] = INF;
    d[nod] = 0;
    q.push({nod, 0});
    while(!q.empty()){
        int u = q.top().first;
        int dst = q.top().second;
        q.pop();
        if(d[u]<dst) continue;
        for(unsigned i=0; i<la[u].size(); i++){
            int v = la[u][i].first;
            int w = la[u][i].second;
            if(d[u]+w<d[v]){
                d[v] = d[u] + w;
                q.push({v, d[v]});
            }
        }
    }
    for(int i=0; i<=k+1; i++)
        cost[id[nod]][ id[ pr[i] ] ] = d[ pr[i] ];
}
int hamilton(){
    int lim = 1<<(k+2);
    for(int i=0; i<lim; i++)
        for(int j=0; j<k+2; j++)
            dp[i][j] = INF;
    dp[1][0] = 0;
    for(int i=0; i<lim; i++)
        for(int v=0; v<k+2; v++)
            if(i&(1<<v))
                for(int u=0; u<k+2; u++)
                    if(i&(1<<u))
                        if(dp[i][v]>dp[ i^(1<<v) ][u] + cost[u][v])
                            dp[i][v] = dp[ i^(1<<v) ][u] + cost[u][v];
    return dp[lim-1][k+1];
}
int main()
{
    fin>>n>>m>>k;
    for(int i=1; i<=k; i++){
        fin>>pr[i];
        id[pr[i]] = i;
    }
    pr[0] = 1; pr[k+1] = n; id[n] = k+1;
    for(int i=1; i<=m; i++){
        int u, v, w;
        fin>>u>>v>>w;
        la[u].push_back({v, w});
        la[v].push_back({u, w});
    }
    for(int i=0; i<=k+1; i++)
        dijkstra(pr[i]);
    fout<<hamilton();
    return 0;
}