Cod sursa(job #2857905)

Utilizator ana_madalina_18Radu Ana Madalina ana_madalina_18 Data 26 februarie 2022 16:28:02
Problema Ubuntzei Scor 15
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.65 kb
#include <fstream>
#include <vector>
#include <queue>
using namespace std;
ifstream fin("ubuntzei.in");
ofstream fout("ubuntzei.out");
int n ,m;
int k, ubuntzei[20];
struct muchie
{
    int nod_curent, nod_urm;
    int cost;
};
vector <muchie> v[2005];
int dist[20][2005], dp[2005][35000];
int vizitat[2005];
const int MAAX=1e9;
struct elem_heap
{
    int nod, cost;
    bool operator <(const elem_heap & other)const
    {
        return cost>other.cost;
    }
};
queue <elem_heap> heap;
void dijkstra(int x)
{
    for(int i=1;i<=n;i++)
    {
        dist[x][i]=MAAX;
        vizitat[i]=0;
    }
    elem_heap nou;
    nou.cost=0;
    nou.nod=ubuntzei[x];
    dist[x][ubuntzei[x]]=0;
    heap.push(nou);
    while(heap.size())
    {
        elem_heap primul=heap.front();
        heap.pop();
        if(vizitat[primul.nod]==1)
        {
            continue;
        }
        vizitat[primul.nod]=1;
        for(int i=0;i<v[primul.nod].size();i++)
        {
            muchie vecin=v[primul.nod][i];
            if(dist[x][vecin.nod_urm]>dist[x][primul.nod]+vecin.cost)
            {
                dist[x][vecin.nod_urm]=dist[x][primul.nod]+vecin.cost;
                elem_heap NEW;
                NEW.cost=dist[x][vecin.nod_urm];
                NEW.nod=vecin.nod_urm;
                heap.push(NEW);
            }
        }
    }
}
void hamilt()
{
    for(int masc=1;masc<(1<<(k+2));masc+=2)
    {
        for(int i=1;i<=k+2;i++)
        {
            for(int j=1;j<=k+2;j++)
            {
                if(((1<<(j-1)) & masc)==0)
                {
                    int masca=masc+(1<<(j-1));
                    dp[j][masca]=min(dp[j][masca],dp[i][masc]+dist[i][ubuntzei[j]]);
                }
            }

        }
    }
}
int main()
{
    fin>>n>>m;
    fin>>k;
    for(int i=1;i<=k;i++)
    {
        fin>>ubuntzei[i];
    }
    for(int i=1;i<=m;i++)
    {
        int a, b, c;
        fin>>a>>b>>c;
        muchie nou;
        nou.cost=c;

        nou.nod_curent=a;
        nou.nod_urm=b;
        v[a].push_back(nou);

        nou.nod_curent=b;
        nou.nod_urm=a;
        v[b].push_back(nou);
    }
    ubuntzei[k+1]=1;
    ubuntzei[k+2]=n;
    for(int i=1;i<=k+2;i++)
    {
        dijkstra(i);

    }

    for(int i=1;i<=k+2;i++)
    {
        for(int j=0;j<(1<<(k+2));j++)
        {
            dp[i][j]=MAAX;
        }
    }
    dp[1][1]=0;
    hamilt();

    int minim=MAAX;
    for(int i=1;i<=k+2;i++)
    {
       minim=min(minim,dp[i][(1<<(k+2))-1]);
       //fout<<dp[i][(1<<(k+2))-1]<<' ';
    }
    //fout<<'\n';
    fout<<minim;
    return 0;
}