Cod sursa(job #2439747)

Utilizator bogdi1bogdan bancuta bogdi1 Data 16 iulie 2019 19:13:21
Problema Ubuntzei Scor 25
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.94 kb
#include <cstdio>
#include <queue>
#include <algorithm>
using namespace std;
int dp[20][65540];
const int INF = 2000000000;
int n;
struct Nod
{
    int x,cost;
    bool operator >(const Nod &other) const
    {
        return this->cost>other.cost;
    }
};
vector<Nod> g[2005];
int oras[20];
int dijk[20][2005];
void dijkstra(int s) {
  int i;
  for(i=1; i<=n; i++)
    dijk[s][i]=INF;
  dijk[s][oras[s]]=0;
  priority_queue<Nod, vector<Nod>, greater<Nod> > q;
  q.push({oras[s], 0});
  while(!q.empty()){
    Nod u=q.top();
    if(dijk[s][u.x]==q.top().cost) {
      q.pop();
      for(i=0; i<g[u.x].size(); i++)
        if(dijk[s][g[u.x][i].x]>dijk[s][u.x]+g[u.x][i].cost) {
          dijk[s][g[u.x][i].x]=dijk[s][u.x]+g[u.x][i].cost;
          q.push({g[u.x][i].x, dijk[s][g[u.x][i].x]});
        }
    }
    else
      q.pop();
  }
}
int main()
{   freopen("ubuntzei.in", "r",stdin);
    freopen("ubuntzei.out", "w",stdout);
    int m,k,i,x,y,z,minn,j,jj;
    scanf("%d%d%d", &n, &m, &k);
    for(i=1; i<=k; i++){
        scanf("%d", &x);
        oras[i]=x;
    }
    oras[k+1]=n;
    oras[k+2]=1;
    for(i=1; i<=m; i++){
        scanf("%d%d%d", &x, &y, &z);
        g[x].push_back({y, z});
        g[y].push_back({x, z});
    }
    for(i=1; i<=k+2; i++)
        dijkstra(i);
    for(i=1; i<=k+1; i++)
        dp[i-1][1<<(i-1)]=dijk[k+2][oras[i]];
    for(i=1; i<(1<<(k+1)); i++){
        minn=INF;
        for(j=0; j<=k; j++)
            if(dp[j][i])
                if(minn>dp[j][i]){
                    minn=dp[j][i];
                    jj=j;
                }
        for(j=0; j<=k; j++)
            if(dp[j][i]==0){
                if(dp[j][i+(1<<j)]!=0)
                    dp[j][i+(1<<j)]=min(dp[j][i+(1<<j)], minn+dijk[jj+1][oras[j+1]]);
                else
                    dp[j][i+(1<<j)]=minn+dijk[jj+1][oras[j+1]];
            }
    }
    printf("%d", dp[k][(1<<(k+1))-1]);
    return 0;
}