Cod sursa(job #3192921)

Utilizator Emilia23Dobra Emilia Emilia23 Data 13 ianuarie 2024 15:17:06
Problema Ubuntzei Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.67 kb
#include <bits/stdc++.h>
#define INF 2000000000
using namespace std;

ifstream f("ubuntzei.in");
ofstream g("ubuntzei.out");

int n,m,k,ubu[20],cost[2005][2005],dp[133000][20],sol=INF;

struct elem
{
    int x,c;
    bool operator < (const elem &a) const
    {
        return c>a.c;
    }
};
vector<elem>a[2005];
priority_queue<elem>pq;

void dijkstra(int nod)
{
    int i;
    elem p;
    for(i=1;i<=n;i++)
        if(ubu[nod]!=i)cost[nod][i]=INF;
    pq.push({ubu[nod],0});
    while(!pq.empty())
    {
        p=pq.top();
        pq.pop();
        for(auto u:a[p.x])
                if(cost[nod][u.x]>cost[nod][p.x]+u.c)
            {
                cost[nod][u.x]=cost[nod][p.x]+u.c;
                pq.push({u.x,cost[nod][u.x]});
            }
    }
}

int main()
{
    int i,j,stare,nod,x,y,z,p=1,vecin;
    f>>n>>m>>k;
    for(i=1;i<=k;i++)f>>ubu[i];
    for(i=1;i<=m;i++)
    {
        f>>x>>y>>z;
        a[x].push_back({y,z});
        a[y].push_back({x,z});
    }
    ubu[0]=1;
    ubu[k+1]=n;
    for(i=0;i<=k+1;i++)
        dijkstra(i);

    for(i=0;i<=k+1;i++)p*=2;
    p--;

    for(stare=0;stare<=p;stare++)
        for(nod=0;nod<=k+1;nod++)dp[stare][nod]=INF;
    dp[1][0]=0;
    for(stare=1;stare<p;stare++)
    {
        for(nod=0;nod<=k+1;nod++)
        if(stare&(1<<nod))
        if(dp[stare][nod]!=INF)
        {
            for(vecin=0;vecin<=k+1;vecin++)
                if((stare&(1<<vecin))==0)
                {
                    dp[stare|(1<<vecin)][vecin]=min(dp[stare|(1<<vecin)][vecin],dp[stare][nod]+cost[nod][ubu[vecin]]);
                }
        }
    }

    g<<dp[p][k+1];
    return 0;
}