Cod sursa(job #3268216)

Utilizator ArthurrrfubinacaARthur Paun Arthurrrfubinaca Data 13 ianuarie 2025 23:58:55
Problema Ubuntzei Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.14 kb
#include <iostream>
#include <vector>
#include <fstream>
#include <queue>
#define Nmax 20005
#define Mmax 10005
#define inf 1e18

using namespace std;

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

bool is_key[Nmax];
vector<pair<int,int>> g[Mmax];
int dp[(1<<20)][20];
int dist[20][20];
int index[20];
int set_index[Nmax];
int n,m,k;

void dijkstra(int start)
{
    priority_queue<pair<int,int>> pq;
    bool viz[Nmax] = {0};
    vector<int> distances(Nmax,inf);
    pq.push(make_pair(0,index[start]));
    while(!pq.empty())
    {
        int node = pq.top().second;
        int cost = pq.top().first;
        pq.pop();
        if(viz[node])
            continue;
        viz[node]=1;
        if(is_key[node])
        {
            dist[start][set_index[node]]= -cost;
        }
        for(auto next : g[node])
        {
            if(!viz[next.first])
            {
                pq.push(make_pair(cost-next.first,next.second));
            }
        }
    }
}

int main()
{
    fin>>n>>m>>k;

    index[0]=1;
    index[k+1]=n;

    set_index[1]=0;
    set_index[n]=k+1;

    is_key[1]=1;
    is_key[n]=1;

    for(int i=1;i<=k;i++)
    {
        fin>>index[i];
        set_index[index[i]]=i;
        is_key[index[i]]=1;
    }

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

        fin>>x>>y>>c;

        g[x].push_back(make_pair(y,c));
        g[y].push_back(make_pair(x,c));
    }
    for(int i=0;i<=k+1;i++)
        dijkstra(i);

    k++;

    for(int conf = 0 ; conf < (1<<k) ; conf++)
    {
        for(int i=0 ; i<k ; i++)
        {
            dp[conf][i+1] = inf;
            if(conf & (1<<i))
            {
                int oldconf = conf ^ (1<<i);
                if(oldconf == 0)
                    dp[conf][i+1] = dist[0][i+1];
                else
                {
                    for(int j=0 ; j<k ; j++)
                    {
                        dp[conf][i+1] = min(dp[conf][i+1],dp[oldconf][j+1] + dist[j+1][i+1]);
                    }
                }
            }
        }
    }
    fout<<dp[(1<<k)-1][k];
    return 0;
}