Cod sursa(job #2503474)

Utilizator alexdumitrescuDumitrescu George Alex alexdumitrescu Data 3 decembrie 2019 10:58:31
Problema Ubuntzei Scor 50
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.92 kb
#include <bits/stdc++.h>
#define Nmax 2000
using namespace std;
ifstream fin ("ubuntzei.in");
ofstream fout ("ubuntzei.out");
int k, n, m, d[1<<15][Nmax], a[16], x, y, c;
struct muchie
{
    int x, c;
};
vector <muchie> v[Nmax];
vector <int> o[16];
void init()
{
    for(int m=0; m<(1<<k); m++)
        for(int i=1; i<=n; i++)
            d[m][i]=INT_MAX;
    d[0][1]=0;
}
struct criteriu
{
    bool operator()(muchie x, muchie y)
    {
        if(x.c!=y.c)
            return x.c<y.c;
        return x.x<y.x;
    }
};
int nrbiti(int x)
{
    int k=0;
    while(x)
    {
        x=x&(x-1);
        k++;
    }
    return k;
}
int main()
{
    fin >> n >> m >> k;
    for(int i=0; i<k; i++)
        fin >> a[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<(1<<k); i++)
        o[nrbiti(i)].push_back(i);

    init();

    for(int i=0; i<=k; i++)
        for(int j=0; j<o[i].size(); j++)
        {
            m = o[i][j];
            set <muchie, criteriu> s;

            for(int l=1; l<=n; l++)
                s.insert({l, d[m][l]});

            while(!s.empty())
            {
                set <muchie, criteriu> :: iterator it = s.begin();
                int aux=it->x;
                for(int l=0; l<v[it->x].size(); l++)
                    if(d[m][v[it->x][l].x] > d[m][it->x]+v[it->x][l].c)
                    {
                        s.erase(s.find({v[it->x][l].x, d[m][v[it->x][l].x]}));
                        d[m][v[it->x][l].x]=d[m][it->x]+v[it->x][l].c;
                        s.insert({v[it->x][l].x, d[m][v[it->x][l].x]});
                    }
                s.erase(it);
            }

            for(int j=0; j<k; j++)
                d[m|(1<<j)][a[j]]=min(d[m|(1<<j)][a[j]], d[m][a[j]]);
        }
    fout << d[(1<<k)-1][n];
    return 0;
}