Cod sursa(job #2563134)

Utilizator MariusblockMoga Marius-Ioan Mariusblock Data 29 februarie 2020 23:57:01
Problema Ubuntzei Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.33 kb
#include <bits/stdc++.h>
#define MOD 104659
#define ull unsigned long long

using namespace std;

ifstream fin("ubuntzei.in");
ofstream fout("ubuntzei.out");
//nu trebuie ca graful sa fie restrans pt ca| dinamica iti da cel mai ieftin lant hamiltonian,indiferent de ce alte contexiuni in plus ai avea care contin nodurile din k intermediare

vector<pair<int,int>> G[2005];
priority_queue<pair<int,int>> Q;
int G2[20][20], DP[131172][20];
int k[30],val[2005], frk[2005], viz[2005];
int n,m,c;
const int inf = 2000000005;

void Dijkstra(int start){
    int i,vecin,cost,dist,nod;
    for(i = 1; i <= n; i++){
        val[i] = inf;
        viz[i] = 0;
    }
    while(!Q.empty()){
        Q.pop();
    }
    Q.push(make_pair(0,start));
    val[start] = 0;
    while(!Q.empty()){
        nod = Q.top().second;
        dist = -Q.top().first;
        viz[nod] = 1;
        Q.pop();
            for(i = 0 ; i < G[nod].size(); i++){
                vecin = G[nod][i].first;
                cost = G[nod][i].second;
                if(val[vecin] > dist+cost){
                    val[vecin] = dist+cost;
                    Q.push(make_pair(-val[vecin],vecin));
                }
            }
        if(!(!frk[nod] || nod == start)){
            G2[frk[start]-1][frk[nod]-1] = val[nod];
        }
        while(!Q.empty() && viz[Q.top().second]){
            Q.pop();
        }
    }
}

int main()
{
    int i,j,a,b,cost,l;
    fin>>n>>m>>c;
    k[1] = 1;
    frk[1] = 1;
    for(i = 2; i <= c+1; i++){
        fin>>k[i];
        frk[k[i]] = i;
    }
    k[c+2] = n;
    frk[n] = c+2;
    c+=2;
    for(i = 1; i <= m; i++){
        fin>>a>>b>>cost;
        G[a].push_back(make_pair(b,cost));
        G[b].push_back(make_pair(a,cost));
    }
    for(i = 1; i <= c; i++){
        Dijkstra(k[i]);
    }

    for(i = 0; i < 1<<c; i++){
        for(j = 0; j < c; j++){
            DP[i][j] = inf;
        }
    }
    DP[1][0] = 0;
    for(i = 1; i < 1<<c; i++){
        for(j = 0; j < c; j++){
            if(i&(1<<j)){
                for(l = 0; l < c; l++){
                    if(i&(1<<l) && l != j){
                        DP[i][j] = min(DP[i][j], DP[i-(1<<j)][l] + G2[j][l]);
                    }
                }
            }
        }
    }
    fout<<DP[(1<<c)-1][c-1]<<'\n';
    return 0;
}