Cod sursa(job #3268220)

Utilizator ArthurrrfubinacaARthur Paun Arthurrrfubinaca Data 14 ianuarie 2025 00:15:42
Problema Ubuntzei Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.97 kb
#include <bits/stdc++.h>
#define Nmax 20005
#define inf 1e9

using namespace std;

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

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

void dijkstra(int i)
{
    priority_queue<pair<int,int>> pq;
    pq.push({0,idx[i]});
    bitset <Nmax>viz;
    while(!pq.empty())
    {
        pair<int,int> urm=pq.top();
        pq.pop();
        if(viz[urm.second]) continue;
        viz[urm.second]=1;
        if(is_key[urm.second])
        {
            dist[i][set_index[urm.second]]=-urm.first;
        }
        for(pair<int,int> u:g[urm.second])
        {
            if(!viz[u.first])
            {
                pq.push({urm.first-u.second,u.first});
            }
        }
    }
}

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

    idx[0]=1;
    idx[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>>idx[i];
        set_index[idx[i]]=i;
        is_key[idx[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;
}