Cod sursa(job #2706819)

Utilizator VladNANegoita Vlad-Andrei VladNA Data 15 februarie 2021 20:36:42
Problema Ubuntzei Scor 45
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.82 kb
#include <bits/stdc++.h>
#define NMAX 2002
#define KMAX 15
#define INF 1e9
using namespace std;

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

struct ura
{
    int c,x;
}v;

struct stare
{
    int nod,lung,config;
}u;

int n,m,k,sm;
int ruta[NMAX];
vector<ura>adj[NMAX];
int dp[NMAX][(1 << KMAX) +1];

int cv(int nod)
{
    if(ruta[nod])
        return (1 << (ruta[nod]-1));
    else
        return 0;
}

bool operator < (stare a, stare b)
{
    if(a.lung==b.lung)
        return (a.config > b.config);
    else
        return (a.lung > b.lung);
}

void initializare()
{
    for(int i=1;i<=n;i++)
        for(int j=0;j<= (1 << k);j++)
            dp[i][j]=INF;
}

void dijkstra()
{
    priority_queue <stare> pq;
    initializare();
    dp[1][0]=0;
    pq.push({1,0,cv(1)});
    while(!pq.empty() && pq.top().lung<dp[n][(1<<k)-1])
    {
        u=pq.top();
        pq.pop();
        for(vector<ura>::iterator it=adj[u.nod].begin();it!=adj[u.nod].end();it++)
        {
            v=*it;
            int config_curenta;
            if(u.config & cv(v.x))
                config_curenta=u.config;
            else
                config_curenta=u.config+cv(v.x);
            if(dp[v.x][config_curenta]>dp[u.nod][u.config]+v.c)
            {
                dp[v.x][config_curenta]=dp[u.nod][u.config]+v.c;
                pq.push({v.x,dp[v.x][config_curenta],config_curenta});
            }
        }
    }
    out<<dp[n][(1<<k)-1];
}

int main()
{
    in>>n>>m>>k;
    for(int i=1;i<=k;i++){
        int nr;
        in>>nr;
        ruta[nr]=i;
    }
    for(int i=1;i<=m;i++)
    {
        int a,b,cost;
        in>>a>>b>>cost;
        sm+=cost;
        adj[a].push_back({cost,b});
        adj[b].push_back({cost,a});
    }
    dijkstra();
    return 0;
}