Cod sursa(job #2789769)

Utilizator etienAndrone Stefan etien Data 27 octombrie 2021 22:22:29
Problema Ubuntzei Scor 20
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.12 kb
#include<bits/stdc++.h>
using namespace std;
ifstream fin("ubuntzei.in");
ofstream fout("ubuntzei.out");
vector<pair<int,int>>v[2001];
int d[18][2001];
vector<int>ub;
int main()
{
    priority_queue<pair<long long,long long>,vector<pair<long long,long long>>,greater<pair<long long,long long>>>pq;
    long long n,m,k;
    fin>>n>>m>>k;
    for(long long i=1;i<=k;i++)
    {
        long long x;
        fin>>x;
        ub.push_back(x);
        for(int j=1;j<=n;j++)
            d[i][j]=2e9+1;
    }
    ub.push_back(1);
    ub.push_back(n);
    k+=2;
    for(int j=1;j<=n;j++)
        d[k-1][j]=2e9+1;
    for(int j=1;j<=n;j++)
        d[k][j]=2e9+1;
    for(long long i=1;i<=m;i++)
    {
        long long a,b,c;
        fin>>a>>b>>c;
        v[a].push_back({c,b});
        v[b].push_back({c,a});
    }
    for(long long i=1;i<=k;i++)
    {
        pq.push({0,ub[i-1]});
        d[i][ub[i-1]]=0;
        while(!pq.empty())
        {
            pair<long long,long long> nod=pq.top();
            //cout<<nod.first<<" "<<nod.second<<": ";
            pq.pop();
            if(nod.first!=d[i][nod.second])
                continue;
            for(auto q:v[nod.second])
            {
                if(d[i][nod.second]+q.first<d[i][q.second])
                {
                    d[i][q.second]=d[i][nod.second]+q.first;
                    pq.push({d[i][q.second],q.second});
                    //cout<<d[i][q.second]<<" "<<q.second<<" ";
                }
            }
            //cout<<endl;
        }
    }
    long long dmin=1e18;
    k-=2;
    if(k==0)
    {
        fout<<d[1][n];
        return 0;
    }
    for(int i=0;i<(1<<k);i++)
    {
        int ci=i;
        vector<int>ord;
        for(int j=0;j<k;j++)
        {
            if(ci%2==1)
                ord.push_back(ub[j]);
            ci/=2;
        }
        if(ord.size()==k)
        {
            long long dd=0;
            dd+=d[k+1][ub[0]];
            for(int j=1;j<k;j++)
                dd+=d[j][ub[j]];
            dd+=d[k+2][ub[k-1]];
            dmin=min(dmin,dd);
        }
    }
    fout<<dmin;
}