Cod sursa(job #2952178)

Utilizator Theo14Ancuta Theodor Theo14 Data 8 decembrie 2022 18:02:35
Problema Ubuntzei Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.83 kb
#include<bits/stdc++.h>
#define int long long
#define INF 1000000000000000000
using namespace std;
ifstream f("ubuntzei.in");
ofstream g("ubuntzei.out");

vector< pair<int,int> >v[2005];
priority_queue< pair<int,int> >pq;
int w[2000],dp[20][1<<18],p[18],fv[2004],poz[2004],n,k,dist[20][2005];

void dijkstram(int nod)
{
    int i;
    pq.push({w[nod],0});
    for(i=1;i<=n;i++)
        dist[nod][i]=INF;
    dist[nod][w[nod]]=0;
    while(!pq.empty())
    {
        int nod1=pq.top().first;
        int cost=pq.top().second;
        pq.pop();
        for(auto it:v[nod1])
        {
            if(dist[nod][it.first]>dist[nod][nod1]+it.second)
            {
                dist[nod][it.first]=dist[nod][nod1]+it.second;
                pq.push({it.first,dist[nod][it.first]});
            }
        }
    }
}

signed main()
{
    int i,m,x,y,z,ok,j,mask;
    f>>n>>m;
    f>>k;
    w[0]=1;
    w[k+1]=n;
    for(i=1;i<=k;i++)
        f>>w[i],fv[w[i]]++,poz[w[i]]=i;
    for(i=1;i<=m;i++)
    {
        f>>x>>y>>z;
        v[x].push_back({y,z});
        v[y].push_back({x,z});
    }
    p[0]=1;
    for(i=1;i<=18;i++)
        p[i]=p[i-1]*2;
    for(i=0;i<=k+1;i++)
        dijkstram(i);
    for(mask=0;mask<=p[k+2]-1;mask++)
        for(i=0;i<=k+1;i++)
            dp[i][mask]=INF;
    dp[0][1]=0;
    for(mask=1;mask<=p[k+2]-1;mask++)
    {
        for(i=0;i<=k+1;i++)
        {
            if((mask&p[i])!=0)
            {
                if(dp[i][mask]!=INF)
                {
                    for(j=0;j<=k+1;j++)
                    {
                        if((mask&p[j])==0)
                            dp[j][mask|p[j]]=min(dp[j][mask|p[j]],dp[i][mask]+dist[i][w[j]]);
                    }
                }
            }
        }
    }
    g<<dp[k+1][p[k+2]-1];
    return 0;
}