Cod sursa(job #2559572)

Utilizator TeddyDinutaDinuta Eduard Stefan TeddyDinuta Data 27 februarie 2020 13:39:13
Problema Ubuntzei Scor 20
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.87 kb
#include <bits/stdc++.h>

using namespace std;
ifstream in("ubuntzei.in");
ofstream out("ubuntzei.out");
int n,m,k,x,y,ok[2005],cost,d[2005][16],ebit;
vector<pair<int,int>> v[2005];
struct lmao
{
    int nod,cate,cost;
    bool operator<(const lmao &aux) const
    {
        if(cost!=aux.cost) return cost>aux.cost;
        else return cate<aux.cate;
    }
};
priority_queue<lmao> q;
lmao z;
void dijkstra(int nod)
{
    for(int i=1;i<=n;i++)
        for(int j=0;j<=k;j++)
          d[i][j]=1e9;
    if(ok[1]==0) {
     q.push({1,0,0});
     d[1][0]=0;
    }
    else
    {
        q.push({1,(1<<ok[1]),0});
        d[1][1]=0;
    }
    while(!q.empty())
    {
        z=q.top();
        q.pop();
        for(auto it:v[z.nod])
        {
            if(ok[it.second]!=0)
            {
            ebit=(z.cate & (1 << (ok[it.second] - 1)));
            if(!ebit)
            if(d[it.second][(z.cate|(1<<(ok[it.second]-1)))]>d[z.nod][z.cate]+it.first)
            {
                d[it.second][(z.cate|(1<<(ok[it.second]-1)))]=d[z.nod][z.cate]+it.first;
                q.push({it.second,(z.cate|(1<<(ok[it.second]-1))),d[it.second][(z.cate|(1<<(ok[it.second]-1)))]});
            }
            }
            else
            {
                if(d[it.second][z.cate]>d[z.nod][z.cate]+it.first)
                {
                    d[it.second][z.cate]=d[z.nod][z.cate]+it.first;
                    q.push({it.second,z.cate,d[it.second][z.cate]});
                }
            }
        }
    }
}
int main()
{
    in>>n>>m;
    in>>k;
    for(int i=1;i<=k;i++)
    {
        in>>x;
        ok[x]=i;
    }
    for(int i=1;i<=m;i++)
    {
        in>>x>>y>>cost;
        v[x].push_back({cost,y});
        v[y].push_back({cost,x});
    }
    dijkstra(1);
    //(int i=0;i<=k;i++) cout<<d[n][i]<<" ";
    out<<d[n][k];
    return 0;
}