Cod sursa(job #2498473)

Utilizator MortemPlaiasu Iulia-Silvia Mortem Data 23 noiembrie 2019 22:38:01
Problema Ubuntzei Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.48 kb
#include <iostream>
#include <fstream>
#include <vector>
#include <queue>
#include <limits.h>
using namespace std;

int n,m;
int k;

struct edge
{
  int d,c;
};
struct elem
{
  int in,c;
};
struct Comp: binary_function<elem,elem,bool>
{
  bool operator() (elem e1, elem e2)
  {
    return e1.c>e2.c;
  }  
};
bool has[16];
vector<edge> v[2500];
int t[2500];
int ct[2500];
int ct2[15][2500];
int d[15][(1<<15)];
int pp[15];
priority_queue<elem,vector<elem>,Comp> pq;

int main()
{
  for(int i=0;i<15;i++)
    pp[i]=1<<i;
  freopen("ubuntzei.in","r",stdin);
  freopen("ubuntzei.out","w",stdout);
  scanf("%d %d",&n,&m);
  scanf("%d",&k);
  for(int i=0;i<k;i++)
    scanf("%d",&t[i]);
  while(m--)
  {
    int j,k,c;
    scanf("%d %d %d",&j,&k,&c);
    v[j].push_back({k,c});
    v[k].push_back({j,c});
  }
  for(int i=0;i<=n;i++)
    ct[i]=INT_MAX;
  ct[1]=0;
  pq.push({1,0});
  while(!pq.empty())
  {
    elem tp =pq.top();
    pq.pop();
    if(tp.c>ct[tp.in]) continue;
    for(int i=0;i<v[tp.in].size();i++)
    {
      edge e = v[tp.in][i];
      if(ct[e.d]>=tp.c+e.c)
      {
        ct[e.d]=tp.c+e.c;
        pq.push({e.d,tp.c+e.c});
      }
    }
  }
  for(int i=0;i<k;i++)
  {
    int countt=0;
    for(int j=0;j<=n;j++)
      ct2[i][j]=INT_MAX;
    ct2[i][t[i]]=0;
    pq.push({t[i],0});
    for(int j=0;j<16;j++)
      has[j]=0;
    while(!pq.empty())
    {
      elem tp =pq.top();
      pq.pop();
      if(tp.c>ct2[i][tp.in]) continue;
      if(tp.in==n&&!has[15])
      {
        has[15]=1;
        countt++;
      }
      for(int l=0;l<k;l++)
        if(tp.in==t[l]&&!has[l])
        {
          has[l]=1;
          countt++;
          break;
        }
      if(countt==k+1) break;
      for(int j=0;j<v[tp.in].size();j++)
      {
        edge e = v[tp.in][j];
        if(ct2[i][e.d]>=tp.c+e.c)
        {
          ct2[i][e.d]=tp.c+e.c;
          pq.push({e.d,tp.c+e.c});
        }
      }
    }
    pq=priority_queue<elem,vector<elem>,Comp>();
  }
  for(int i=0;i<(1<<k);i++)
      for(int j=0;j<k;j++)
        d[j][i]=INT_MAX;
  for(int i=0;i<k;i++)
  {
    int p = t[i];
    d[i][1<<i]=ct[p];
  }
  for(int i=0;i<(1<<k)-1;i++)
    for(int j=0;j<k;j++)
    {
      int pj= 1<<j;
      int sj= i|pj;
      if((i&pj)!=0) continue; 
      for(int p=0;p<k;p++)
      {
        if((i&pp[p])==0) continue;
        int tj= t[j];
        d[j][sj]=min(d[j][sj],d[p][i]+ct2[p][tj]);
      }
    }
  int minn=INT_MAX;
  for(int i=0;i<k;i++)
    minn=min(minn,d[i][(1<<k)-1]+ct2[i][n]);
  if(k==0)
    minn= ct[n];
  printf("%d",minn);
}