Cod sursa(job #2537187)

Utilizator matei123Biciusca Matei matei123 Data 3 februarie 2020 11:42:48
Problema Ubuntzei Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.9 kb
#include <bits/stdc++.h>
#define dim 2005
#define kmax (1<<15)+5
using namespace std;
ifstream f("ubuntzei.in");
ofstream g("ubuntzei.out");
const int inf=1e9;
int n,m,k;
int city[20],dp[dim][dim];
int ans[kmax][20];
vector <pair <int,int> > graph[dim];
priority_queue < pair<int, int>, vector < pair<int, int> >,greater< pair<int, int> > > q;
void Read()
{   f>>n>>m>>k;
    for(int i=1; i<=k; ++i) f>>city[i];
    for(int i=1; i<=m; ++i)
    {   int x,y,cost;
        f>>x>>y>>cost;
        graph[x].push_back(make_pair(cost,y));
        graph[y].push_back(make_pair(cost,x));
    }
}
void Dijkstra(int node)
{   for(int i=1; i<=n; ++i) dp[node][i]=inf;
    dp[node][node]=0;
    q.push(make_pair(0,node));
    while(!q.empty())
    {   int node1=q.top().second;
        int dist=q.top().first;
        q.pop();
        if(dist!=dp[node][node1])continue;
        for(int i=0; i<graph[node1].size(); ++i)
        {   int son=graph[node1][i].second;
            int dist1=graph[node1][i].first;
            if(dp[node][son]>dist1+dist)
            {   dp[node][son]=dist1+dist;
                q.push(make_pair(dp[node][son],son));
            }
        }
    }
}
void Solve()
{   Dijkstra(1);
    for(int i=1; i<=k; ++i) Dijkstra(city[i]);
    if(k==0)
    {   g<<dp[1][n];
        return;
    }
    for(int i=1; i<(1<<k); ++i)
        for(int j=1; j<=n; ++j) ans[i][j]=inf;
    for(int i=1; i<=k; ++i)
        ans[1<<(i-1)][i]=dp[1][city[i]];
    for(int i=1; i<(1<<k); ++i)
        for(int j=1; j<=k; ++j)
            if(i&(1<<(j-1)))
                for(int q=1; q<=k; ++q)
                    if((i&(1<<(q-1)))&&q!=j)
                        ans[i][j]=min(ans[i][j],ans[i^(1<<(j-1))][q]+dp[city[q]][city[j]]);
    int Min=inf;
    for(int i=1; i<=k; ++i)
        Min=min(ans[(1<<k)-1][i]+dp[city[i]][n],Min);
    g<<Min;
}
int main()
{   Read();
    Solve();
    return 0;
}