Cod sursa(job #2560290)

Utilizator TeddyDinutaDinuta Eduard Stefan TeddyDinuta Data 27 februarie 2020 21:16:23
Problema Ubuntzei Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.54 kb
#include <bits/stdc++.h>

using namespace std;
ifstream in("ubuntzei.in");
ofstream out("ubuntzei.out");
int n,m,k,x,y,c[17],cost,d[17][2005],dp[131080][20];
vector<pair<int,int>> v[2005];
priority_queue< pair<int,int> , vector<pair<int,int>> ,greater<pair<int,int>>> q;
pair<int,int> z;
void dijkstra(int nod,int d[])
{
    for(int i=1;i<=n;i++)
          d[i]=1e9;
     q.push({0,nod});
     d[nod]=0;
    while(!q.empty())
    {
        z=q.top();
        q.pop();
        for(auto it:v[z.second])
        {
            if(d[it.second]>d[z.second]+it.first)
            {
                d[it.second]=d[z.second]+it.first;
                q.push({d[it.second],it.second});
            }
        }
    }
}
int main()
{
    in>>n>>m;
    in>>k;
    for(int i=1;i<=k;i++)
        in>>c[i];
    for(int i=1;i<=m;i++)
    {
        in>>x>>y>>cost;
        v[x].push_back({cost,y});
        v[y].push_back({cost,x});
    }
    c[0]=1;
    c[++k]=n;
    for(int i=0;i<=k;i++)
        dijkstra(c[i],d[i]);
    for(int i=1;i<=((1<<(k+1))-1);i++)
        for(int j=0;j<=k;j++)
          dp[i][j]=1e9;
    dp[1][0]=0;
    for(int i=2;i<=((1<<(k+1))-1);i++)
    {
        for(int j=0;j<=k;j++)
        {
            if((1<<j)&i)
            {
                for(int q=0;q<=k;q++)
                    if(((1<<q)&i)&&q!=j)
                     dp[i][j]=min(dp[i][j],dp[i^(1<<j)][q]+d[q][c[j]]);
            }
        }

    }
    //(int i=0;i<=k;i++) cout<<d[n][i]<<" ";
    out<<dp[(1<<(k+1))-1][k];
    return 0;
}