Cod sursa(job #2373414)

Utilizator Daria09Florea Daria Daria09 Data 7 martie 2019 13:23:57
Problema Ubuntzei Scor 20
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.99 kb
#include <bits/stdc++.h>
#define dim 2005
#define inf int(1e9)
#define kmax (1<<15)+5
using namespace std;
ifstream f("ubuntzei.in");
ofstream g("ubuntzei.out");
int n,m,k;
int city[20],dp[dim][dim];
int ans[kmax][20];
struct ubuntzei
{
    int cost,x;
};
vector <ubuntzei> 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({cost,y});
        graph[y].push_back({cost,x});
    }
}
void Dijkstra(int node)
{
    for(int i=1; i<=n; ++i)
        dp[node][i]=inf;
    dp[node][node]=0;
    q.push({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].x;
            int dist1=graph[node1][i].cost;
            if(dp[node][son]>dist1+dist)
            {
                dp[node][son]=dist1+dist;
                q.push({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;
}