Cod sursa(job #2127405)

Utilizator alex2kamebossPuscasu Alexandru alex2kameboss Data 10 februarie 2018 17:03:50
Problema Ubuntzei Scor 20
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.66 kb
#include <iostream>
#include <cstdio>
#include <vector>
#include <cstring>
#include <set>

using namespace std;
int n,m,k,a,b,c;
vector <int> lk;
int dist[18][2005];
vector <pair<int,int>> g[2001];
int d[18][1<<18];
const int INF = 0x3f3f3f3f;
void dijistra(int nod)
{
    memset(dist[k],INF,sizeof dist[k]);
    set<pair<int,int>> q;
    q.insert({0,nod});
    dist[k][nod]=0;
    while(!q.empty())
    {
        a=q.begin()->second;
        q.erase(q.begin());
        for(pair<int,int> i: g[a])
        {
            b=i.first;
            c=i.second;
            if(dist[k][b]>dist[k][a]+c)
            {
                if(dist[k][b]!=INF)
                    q.erase(q.find({dist[k][b],b}));
                dist[k][b]=dist[k][a]+c;
                q.insert({dist[k][b],b});
            }
        }
    }
}
int main()
{
    freopen("ubuntzei.in","r",stdin);
    freopen("ubuntzei.out","w",stdout);
    scanf("%d %d\n%d", &n,&m,&k);
    for(int i=0;i<k;++i)
        scanf(" %d", &a), lk.push_back(a);
    lk.push_back(n);
    for(int i=0;i<m;++i)
    {
        scanf("\n%d %d %d", &a,&b,&c);
        g[a].push_back({b,c});
        g[b].push_back({a,c});
    }
    k=0;
    for(int i:lk)
        dijistra(i), ++k;
    for(int i=0;i<(1<<k);++i)
    {
        for(int j=0;j<k;++j)
            d[i][j]=INF;
    }
    for(int j=0;j<k;++j)
        d[1<<j][j]=dist[j][1];
    for(int i=1;i<(1<<k);++i)
    {
        for(int j=0;j<k;++j)
        {
            if(i&(1<<j))
            {
                for(int q=0;q<k;++q)
                    if(i&(1<<q))
                        d[i][j]=min(d[i][j],d[i^(1<<j)][q]+dist[q][lk[j]]);
            }
        }
    }
    cout<<d[(1<<k)-1][k-1];
    return 0;
}