Cod sursa(job #2503591)

Utilizator alexdumitrescuDumitrescu George Alex alexdumitrescu Data 3 decembrie 2019 14:47:52
Problema Ubuntzei Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.91 kb
#include <bits/stdc++.h>
#define Nmax 2005
using namespace std;
ifstream fin ("ubuntzei.in");
ofstream fout ("ubuntzei.out");
int n, m, k, d[Nmax], ha[15], a[16][16], x, y, c, dp[1<<15][15];

struct muchie
{
    int x, c;
};
vector <muchie> v[Nmax];
struct criteriu
{
    bool operator()(int x, int y)
    {
        if(d[x]!=d[y])
            return d[x]<d[y];
        return x<y;
    }
};

void dijkstra(int x, int nr)
{
    for(int i=1;i<=n;i++)
        d[i]=INT_MAX;
    d[x]=0;
    set <int, criteriu> s;
    for(int i=1;i<=n;i++)
        s.insert(i);
    while(!s.empty())
    {
        set <int, criteriu> :: iterator it = s.begin();
        for(int i=0;i<v[*it].size();i++)
            if(d[v[*it][i].x] > d[*it]+v[*it][i].c)
            {
                s.erase(s.find(v[*it][i].x));
                d[v[*it][i].x] = d[*it]+v[*it][i].c;
                s.insert(v[*it][i].x);
            }
        s.erase(it);
    }
    for(int i=0;i<k;i++)
        a[nr][i]=d[ha[i]];
    a[nr][k]=d[n];
}

int main()
{
    fin >> n >> m >> k;
    for(int i=0; i<k; i++)
        fin >> ha[i];

    for(int i=1; i<=m; i++)
    {
        fin >> x >> y >> c;
        v[x].push_back({y, c});
        v[y].push_back({x, c});
    }
    for(int i=0;i<k;i++)
        dijkstra(ha[i], i);
    dijkstra(1, k);
    if(k==0)
    {
        fout << a[k][k];
        return 0;
    }
    for(int i=0;i<k;i++)
        dp[(1<<i)][i]=a[k][i];

    for(int i=0;i<(1<<k);i++)
        for(int j=0;j<k;j++)
            if(i&(1<<j)&&(i&(i-1)))
            {
                m=i^(1<<j);
                dp[i][j]=INT_MAX;
                for(int l=0;l<k;l++)
                    if(m&(1<<l))
                        dp[i][j]=min(dp[i][j], dp[m][l]+a[j][l]);
            }
    int minn=INT_MAX;
    for(int i=0;i<k;i++)
        minn=min(minn, dp[(1<<k)-1][i]+a[i][k]);
    fout << minn;
    return 0;
}