Cod sursa(job #2721171)

Utilizator levladiatorDragutoiu Vlad-Ioan levladiator Data 11 martie 2021 16:56:01
Problema Ubuntzei Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.92 kb
#include <bits/stdc++.h>
#define mp make_pair
#define pb push_back
#define pf push_front
#define ll long long
#define ull unsigned long long
#define x first
#define y second
#define pi pair<int,int>
#define pl pair<ll,ll>

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


const ll N=2e3+5,INF=1e18,MOD=100003,M=1e2+5,inf=INT_MAX;

int n,m,k;
int dist[N],d[20][20],v[20],dp[1<<18][20];
vector<pair<int,int> >adj[N];

void dijkstra(int node)
{
    priority_queue<pair<int,int> > pq;
    for(int i=1;i<=n;i++)
    {
        dist[i]=1e9;
    }
    pq.push({0,node});
    dist[node]=0;
    while(!pq.empty())
    {
        int a=pq.top().second;
        pq.pop();
        for(int i=0;i<adj[a].size();i++)
        {
            int b=adj[a][i].first;
            int cost=adj[a][i].second;
            if(dist[b]>dist[a]+cost)
            {
                dist[b]=dist[a]+cost;
                pq.push({-dist[b],b});
            }
        }
    }
}

int main()
{
    fin>>n>>m>>k;
    for(int i=1;i<=k;i++)
    {
        fin>>v[i];
    }
    v[0]=1;
    v[k+1]=n;
    for(int i=1;i<=m;i++)
    {
        int a,b,c;
        fin>>a>>b>>c;
        adj[a].pb({b,c});
        adj[b].pb({a,c});
    }
    for(int i=0;i<=k+1;i++)
    {
        dijkstra(v[i]);
        for(int j=0;j<=k+1;j++)
        {
            d[i][j]=dist[v[j]];
        }
        if(i)d[i][i]=1e9;
    }
    for(int i=0;i<(1<<(k+2));i++)
    {
        for(int j=0;j<=k+1;j++)
        {
            dp[i][j]=1e9;
        }
    }
    dp[0][0]=0;
    for(int i=0;i<(1<<(k+2));i++)
    {
        for(int j=0;j<=k+1;j++)
        {
            if(i&(1<<j))
            {
                for(int p=0;p<=k+1;p++)
                {
                    dp[i][j]=min(dp[i][j],dp[i^(1<<j)][p]+d[p][j]);
                }
            }
        }
    }
    fout<<dp[(1<<(k+2))-1][k+1];

}