Cod sursa(job #3224574)

Utilizator unomMirel Costel unom Data 15 aprilie 2024 17:42:58
Problema Ubuntzei Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.03 kb
#include <fstream>
#include <vector>
#include <set>

using namespace std;

ifstream in("ubuntzei.in");
ofstream out("ubuntzei.out");
int n, m, cnt;
int w[20];
vector<pair<int, int>> v[2005];
int dist[20][10005];
int dp[32780];
int INF = (1 << 30);

void dijkstra(int start)
{
    for(int i = 1; i<=n; i++)
    {
        dist[start][i] = INF;
    }

    multiset<pair<int, int>> s;
    s.insert({w[start], 0});
    dist[start][w[start]] = 0;

    int nod, d;
    while(!s.empty())
    {
        nod = (*s.begin()).first;
        d = (*s.begin()).second;

        s.erase(s.begin());
        for(auto it: v[nod])
        {
            if(dist[start][it.first] > d + it.second)
            {
                dist[start][it.first] = d + it.second;
                s.insert({it.first, dist[start][it.first]});
            }
        }
    }
}

int main()
{
    in>>n>>m;

    in>>cnt;
    for(int i = 0; i<cnt; i++)
    {
        in>>w[i];
    }

    int x, y, c;
    for(int i = 1; i<=m; i++)
    {
        in>>x>>y>>c;

        v[x].push_back({y, c});
        v[y].push_back({x, c});
    }

    int stmax = (1 << cnt);

    for(int i = 0; i<stmax; i++)
    {
        dp[i] = INF;
    }

    for(int i = 0; i<cnt; i++)
    {
        dijkstra(i);

        /*for(int j = 1; j<=n; j++)
        {
            out<<dist[i][j]<<" ";
        }*/

        dp[1 << i] = dist[i][1];
    }

    for(int mask = 0; mask < stmax; mask++)
    {
        for(int i = 0; i<cnt; i++)
        {
            if(mask & (1 << i))
            {
                for(int j = 0; j<cnt; j++)
                {
                    if(i != j && (mask & (1 << j)) == 0)
                    {
                        dp[mask + (1 << j)] = min(dp[mask + (1 << j)], dp[mask] + dist[i][w[j]]);
                    }
                }
            }
        }
    }

    int ans = INF;
    for(int i = 0; i<cnt; i++)
    {
        ans = min(ans, dp[stmax - 1] + dist[i][n]);
    }

    out<<ans;

    return 0;
}