Cod sursa(job #2568491)

Utilizator Daria09Florea Daria Daria09 Data 3 martie 2020 23:57:44
Problema Ubuntzei Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.23 kb
#include <bits/stdc++.h>
#define dim 2005
#define inf INT_MAX
#define dimm 1<<(17)
using namespace std;
ifstream f("ubuntzei.in");
ofstream g("ubuntzei.out");
int n,k,m;
int city[20],dist[dim][dim],dp[dimm][20];
struct point
{
    int cost,x;
    bool operator <(const point & other) const
    {
        return cost>other.cost;
    }
};
priority_queue <point> q;
vector <point> graph[dim];
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)
        dist[node][i]=inf;
    dist[node][node]=0;
    q.push({0,node});
    while(!q.empty())
    {
        int son=q.top().x,cost=q.top().cost;
        q.pop();
        if(cost!=dist[node][son])continue;
        for(int i=0; i<graph[son].size(); ++i)
        {
            int nextt=graph[son][i].x;
            int cost1=graph[son][i].cost;
            if(dist[node][nextt]>dist[node][son]+cost1)
            {
                dist[node][nextt]=cost1+dist[node][son];
                q.push({dist[node][nextt],nextt});
            }
        }
    }
}
void Solve()
{
    Dijkstra(1);
    for(int i=1; i<=k; ++i)
        Dijkstra(city[i]);
    if(k==0)
    {
        g<<dist[1][n];
        return;
    }
    for(int i=1; i<(1<<k); ++i)
        for(int j=1; j<=n; ++j)
            dp[i][j]=inf;
    for(int i=1; i<=k; ++i)
        dp[(1<<(i-1))][i]=dist[1][city[i]];
    for(int stare=1; stare<(1<<k); ++stare)
        for(int oras=1; oras<=k; ++oras)
            if(stare&(1<<(oras-1))) // trecem prin orasul oras
                for(int j=1; j<=k; ++j)
                    if(stare&(1<<(j-1))&&j!=oras) // trecem printr-un oras de mijloc
                        dp[stare][oras]=min(dp[stare][oras],
                                            dp[stare^(1<<(oras-1))][j]
                                            +dist[city[j]][city[oras]]);
    int ans=inf;
    for(int i=1; i<=k; ++i)
        ans=min(ans,dp[(1<<k)-1][i]+dist[city[i]][n]);
    g<<ans;
}
int main()
{
    Read();
    Solve();
    return 0;
}