Cod sursa(job #3259869)

Utilizator Federica361Martinut Federica Federica361 Data 28 noiembrie 2024 11:53:03
Problema Ubuntzei Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.86 kb
#include <bits/stdc++.h>

using namespace std;

ifstream fin("ubuntzei.in");
ofstream fout("ubuntzei.out");
#define cin fin
#define cout fout

#define Nmax 20005
#define inf 10000005


bool isk[Nmax];
int val[Nmax],dp[(1<<20)][20],g[20][20],c[25];
vector<pair<int,int>> v[Nmax];


void dijk(int i)
{
    priority_queue<pair<int,int>> pq;
    pq.push({0,c[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(isk[urm.second])
        {
            g[i][val[urm.second]]=-urm.first;
        }
        for(pair<int,int> u:v[urm.second])
        {
            if(!viz[u.first])
            {
                pq.push({urm.first-u.second,u.first});
            }
        }
    }
}

int main()
{
    int n,m,k;
    cin>>n>>m>>k;
    c[0]=1; c[k+1]=n;
    val[1]=0; val[n]=k+1;
    isk[1]=1; isk[n]=1;
    for(int i=1;i<=k;i++)
    {
        cin>>c[i];
        val[c[i]]=i; isk[c[i]]=1;
    }
    for(int i=1;i<=m;i++)
    {
        int x,y,c;
        cin>>x>>y>>c;
        v[x].push_back({y,c});
        v[y].push_back({x,c});
    }
    for(int i=0;i<=k+1;i++) dijk(i);
    k++;
    for(int mask=0;mask<(1<<k);mask++)
    {
        for(int j=0;j<k;j++)
        {
            dp[mask][j+1]=inf;
            if((mask&(1<<j))!=0)
            {
                int prev=mask-(1<<j);
                if(prev==0)
                {
                    dp[mask][j+1]=g[0][j+1];
                }
                else
                {
                    for(int b=0;b<k;b++)
                    {
                        dp[mask][j+1]=min(dp[mask][j+1],dp[prev][b+1]+g[b+1][j+1]);
                    }
                }
            }
        }
    }
    cout<<dp[(1<<k)-1][k]<<'\n';
    return 0;
}