Cod sursa(job #2972383)

Utilizator Luca529Taschina Luca Luca529 Data 29 ianuarie 2023 13:37:19
Problema Ubuntzei Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.92 kb
#include <iostream>
#include <fstream>
#include <vector>
#include <queue>

using namespace std;
ifstream fin("ubuntzei.in");
ofstream fout("ubuntzei.out");
int n,k,p1[2001],d[2001],z[2001],w[2001],y[2001][2001],k1,mini=2000000000;
int dp[1<<17][17];
bool p[2001];
vector<pair<int, int> > x[4001];

struct C{

bool operator()(int a, int b)
{
    return d[a]>d[b];
}

};

priority_queue<int, vector<int>, C> q;

void Dijkstra(int a)
{q.push(a);
 p[a]=1;
 d[a]=0;

 while(q.empty()!=1)
 {a=q.top();
  p[a]=0;

  for(size_t i=0;i<x[a].size();i++)
  {int v=x[a][i].first, c=x[a][i].second;
   if(d[v]>d[a]+c)
   {d[v]=d[a]+c;
    if(p[v]==0)
    {p[v]=1;
     q.push(v);
    }
   }
  }
  q.pop();
 }
}

void D(int a, int k, int s)
{if(k==k1 && a==k)
 {
     if(s<mini)mini=s;
 }
 else if(k!=k1)
 {for(int i=1;i<=k1;i++)
  if(y[a][i]!=0)
  {int m=y[a][i];
   y[a][i]=y[i][a]=0;
   D(i, k+1, s+m);
   y[a][i]=y[i][a]=m;
  }
 }
}

int main()
{   int m,a,b,c;
    fin>>n>>m>>k;

    z[1]=1;
    for(int i=2;i<=k+1;i++)
    {fin>>a;
     z[i]=a;
    }
    for(int i=1;i<=m;i++)
    {fin>>a>>b>>c;
     x[a].push_back(make_pair(b, c));
     x[b].push_back(make_pair(a, c));
    }
    k+=2;
    z[k]=n;

    for(int i=1;i<=k;i++)
    {for(int j=1;j<=n;j++)
     d[j]=2000000000;
     Dijkstra(z[i]);

     for(int j=1;j<i;j++)
     if(p1[z[j]]==1)
     y[i][j]=y[j][i]=d[z[j]];

     for(int j=1;j<=n;j++)
     d[j]=p[j]=0;
     p1[z[i]]=1;
    }

    k1=k;
    for(int i=0;i<k1;i++)
    for(int j=0;j<k1;j++)
    y[i][j]=y[i+1][j+1];

    for(int i=0;i<k1;i++)
    for(int j=0;j<1<<17;j++)
    dp[j][i]=10000000;

    dp[1][0]=0;

    for(int mask=3;mask<1<<k1;mask+=2)
    for(int i=1;i<k;i++)
    if(mask & (1<<i))
    for(int j=0;j<k;j++)
    if(y[i][j])dp[mask][i]=min(dp[mask][i], dp[mask ^ 1<<i][j]+y[i][j]);

    fout<<dp[(1<<k)-1][k-1];
    return 0;
}