Cod sursa(job #2488585)

Utilizator KataIsache Catalina Kata Data 7 noiembrie 2019 09:32:07
Problema Ubuntzei Scor 10
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.63 kb
#define inf 100000000
#include <bits/stdc++.h>
using namespace std;
ifstream fin("ubuntzei.in");
ofstream fout("ubuntzei.out");
vector<pair <int,int> > M[2002];
int dist[32768][2002];
priority_queue< pair<int, int>, vector <pair<int, int> > , greater<pair<int, int> > > Q;
int vi[16],fr[16];
int main()
{
    int n,m,j,i,x,y,c,k,nod,v;
    fin>>n>>m;
    fin>>k;
    int ck=k;
    k++;
    for(i=1;i<k;i++)
    {
        fin>>vi[i];
        fr[vi[i]]=i;
    }
    for(i=1;i<=m;i++)
    {
        fin>>x>>y>>c;
        M[x].push_back({c,y});
        M[y].push_back({c,x});
    }
    x=1<<k;
    for(i=0; i<=x;i++)
		for(j=0; j<=n;j++) dist[i][j] = inf;
    Q.push({0,1});
    dist[0][1]=0;
    while(!Q.empty())
    {
        nod=Q.top().second;
        Q.pop();
        for(i=0;i<M[nod].size();i++)
        {
            v=M[nod][i].second;
            c=M[nod][i].first;
            if(fr[v])
                {for(k=1;k<x;k++)
                    if (k & (1<<(fr[v]-1)))
                            if(dist[k^(1<<(fr[v]-1))][nod]+c<dist[k][v])
                            {
                                dist[k][v]=dist[k^(1<<(fr[v]-1))][nod]+c;
                                Q.push({dist[k][v],v});
                            }
                }
            else
            {
                for(k=0;k<x;k++)
                        if(dist[k][v]>dist[k][nod]+c)
                        {
                          dist[k][v]=dist[k][nod]+c;
                          Q.push({dist[k][v],v});
                        }
            }
        }
    }
    fout<<dist[(1<<ck)-1][n];
    return 0;
}