Cod sursa(job #2948205)

Utilizator AndreiBOTOBotocan Andrei AndreiBOTO Data 27 noiembrie 2022 14:01:29
Problema Ubuntzei Scor 75
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.15 kb
#include <iostream>
#include <fstream>
#include <queue>
#include <vector>

#pragma GCC optimize("unroll-loops")
#pragma gcc optimize("Ofast")

///#include <tryhardmode>
///#include <GODMODE::ON>

using namespace std;

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

const int INF=1e9;
const int NMAX=2005;
const int MASK=20;

int c[NMAX];
int dist1[NMAX];

vector<pair<int,int>>v[NMAX];
priority_queue<pair<int,int>>q;

int dist2[NMAX][NMAX];
int dp[(1<<MASK)][MASK];
int n;

void reset(int n)
{
    for(int i=1;i<=n;++i)
        dist1[i]=INF;
}

void dijkstra(int p)
{
    reset(n);
    dist1[p]=0;
    q.push(make_pair(0,p));
    while(!q.empty())
    {
        pair<int,int>p=q.top();
        q.pop();
        if(p.first<=dist1[p.second])
        {
            for(auto i:v[p.second])
            {
                if(dist1[p.second]+i.second<dist1[i.first])
                {
                    dist1[i.first]=dist1[p.second]+i.second;
                    q.push(make_pair(dist1[i.first],i.first));
                }
            }
        }
    }
}

int main()
{
    int m,i,k,j,x,y,cost,mask,l1,l2;
    fin>>n>>m>>k;
    l1=(1<<(k+2));
    l2=k+2;
    c[0]=1;
    c[k+1]=n;
    for(i=1;i<=k;++i)
        fin>>c[i];
    while(m--)
    {
        fin>>x>>y>>cost;
        v[x].push_back(make_pair(y,cost));
        v[y].push_back(make_pair(x,cost));
    }
    for(i=0;i<=k+1;++i)
    {
        dijkstra(c[i]);
        for(j=0;j<=k+1;++j)
        {
            dist2[i][j]=dist1[c[j]];
            dist2[j][i]=dist1[c[j]];
        }
        dist2[i][i]=INF;
    }
    for(i=0;i<l1;++i)
    {
        for(j=0;j<l2;++j)
        {
            dp[i][j]=INF;
        }
    }
    dp[1][0]=0;
    dp[0][0]=0;
    for(mask=0;mask<l1;++mask)
    {
        for(i=0;i<l2;++i)
            if(mask & (1<<i))
            {
                for(j=0;j<l2;++j)
                {
                    if(dp[mask][i]>dp[mask^(1<<i)][j]+dist2[i][j])
                        dp[mask][i]=dp[mask^(1<<i)][j]+dist2[i][j];
                }
            }
    }
    fout<<dp[l1-1][l2-1];
    return 0;
}