Cod sursa(job #2481729)

Utilizator anamariatoaderAna Toader anamariatoader Data 27 octombrie 2019 12:45:04
Problema Ubuntzei Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.92 kb
#include <fstream>
#include <climits>
#include <cstring>
#include <vector>
#include <queue>
#define inf INT_MAX

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

int n,m,k,i,j,x,y,st,c;
int v[20],d[20][2005],dp[20][(1<<15)+1];
bool viz[2005];
struct arc{
    int nod,cost;
};
vector <arc> g[2005];
struct cmp{
    bool operator()(arc &a, arc &b){
        return a.cost>b.cost;
    }
};
priority_queue <arc, vector<arc>, cmp> h;

void dijkstra(int poz){
    int s=v[poz];
    for(int j=1;j<=n;j++)
        d[poz][j]=inf;
    d[poz][s]=0;
    h.push({s,0});
    memset(viz,0,sizeof(viz));
    while(!h.empty()){
        arc p=h.top();
        h.pop();
        int nod=p.nod;
        if(viz[nod])
            continue;
        viz[nod]=1;
        for(int j=0;j<g[nod].size();j++){
            int nou=g[nod][j].nod;
            int cost=g[nod][j].cost;
            if(d[poz][nou]>d[poz][nod]+cost&&viz[nou]==0){
                d[poz][nou]=d[poz][nod]+cost;
                h.push({nou,d[poz][nou]});
            }
        }
    }
}

int main()
{
    fin>>n>>m>>k;
    for(i=1;i<=k;i++)
        fin>>v[i];
    for(i=1;i<=m;i++){
        fin>>x>>y>>c;
        g[x].push_back({y,c});
        g[y].push_back({x,c});
    }
    k++;
    v[k]=1;
    for(i=1;i<=k;i++)
        dijkstra(i);
  if(k==1){
     fout<<d[1][n];
     return 0;
  }
 k--;
    for(i=1;i<=k;i++){
      for(j=1;j<(1<<k);j++)
         dp[i][j]=inf;
      dp[i][(1<<(i-1))]=d[i][1];
    }
    for(st=1;st<(1<<k);st++)
      for(i=1;i<=k;i++)
       if(dp[i][st]!=inf){
         for(j=1;j<=k;j++)
           if(j!=i && ((st>>(j-1))&1)==0){
               int stare=(st|(1<<(j-1)));
               dp[j][stare]=min(dp[j][stare],dp[i][st]+d[j][v[i]]);
           }
       }
    int mn=inf;
    for(i=1;i<=k;i++)
        mn=min(mn,dp[i][(1<<k)-1]+d[i][n]);
    fout<<mn;
    return 0;
}