Cod sursa(job #2801330)

Utilizator BalasaRaduBalasa Radu BalasaRadu Data 15 noiembrie 2021 23:50:19
Problema Ubuntzei Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.99 kb
#include <bits/stdc++.h>
using namespace std;

ifstream fin("ubuntzei.in");
ofstream fout("ubuntzei.out");

const int dim=2009,inf=1e9;

struct elem{
    int y,c;
    bool operator <(const elem &a) const
    {
        return c>a.c;
    }
};

vector<elem>v[dim];
priority_queue<elem>q;

int n,m,k,w[20];
int dist[dim][dim];
int dp[1<<17][20];

void dijkstra(int start){
    dist[start][start]=0;
    q.push({start,0});
    while(!q.empty()){
        int x=q.top().y;
        int c=q.top().c;
        q.pop();
        if(c==dist[start][x]){
            for(auto y:v[x]){
                if(c+y.c<dist[start][y.y]){
                    dist[start][y.y]=c+y.c;
                    q.push({y.y,dist[start][y.y]});
                }
            }
        }
    }
}

signed main(){
        fin>>n>>m;
        fin>>k;
    w[0]=1;
    for(int i=1;i<=k;i++){
        fin>>w[i];
    }

    for(int i=1;i<=m;i++){
        int x,y,c;
        fin>>x>>y>>c;
        v[x].push_back({y,c});
        v[y].push_back({x,c});
    }

    for(int i=1;i<=n;i++){
        for(int j=1;j<=n;j++){
            dist[i][j]=inf;
        }
    }

    if(k==0){
        dijkstra(1);
        fout<<dist[1][n];
        return 0;
    }
    for(int i=0;i<=k;i++){
        dijkstra(w[i]);
    }
    for(int i=1;i<=(1<<(k+1));i++){
        for(int j=1;j<=k;j++){
            dp[i][j]=inf;
            dp[1<<j][j]=dist[1][w[j]];
        }
    }

    for(int stare=1;stare<=(1<<(k+1));stare++){
        for(int i=1;i<=k;i++){
            if(stare&(1<<i)){
                for(int j=1;j<=k;j++){
                    if(!(stare&(1<<j))){
                        int stare_noua=(stare+(1<<j));
                        dp[stare_noua][j]=min(dp[stare_noua][j],dp[stare][i]+dist[w[j]][w[i]]);
                    }
                }
            }
        }
    }
    int ans=inf;
    for(int i=1;i<=k;i++){
        ans=min(ans,dp[(1<<(k+1))-2][i]+dist[w[i]][n]);
    }
    fout<<ans;
}