Cod sursa(job #3188796)

Utilizator BreabanDanielBreaban Daniel-Vasile BreabanDaniel Data 3 ianuarie 2024 20:42:28
Problema Ubuntzei Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.03 kb
#include <fstream>
#include <set>
#include <vector>
#define INF 1000000000
using namespace std;
ifstream fin("ubuntzei.in");
ofstream fout("ubuntzei.out");
vector <pair <int,int>  > v[2009];
vector <int> ubu;
void dijkstra(int b);
int n,m,cost[17][2009],k,dp[20][34000],doi[20];
int main()
{
    fin>>n>>m>>k;
    doi[0]=1;
    for(int i=1;i<=18;i++)
        doi[i]=doi[i-1]*2;
    for(int i=1;i<=k;i++)
    {
        int x;
        fin>>x;
        ubu.push_back(x);
    }
    for(int i=1;i<=m;i++)
    {
        int x,y,c;
        fin>>x>>y>>c;
        v[x].push_back({y,c});
        v[y].push_back({x,c});
    }
    dijkstra(1);
    dijkstra(n);
    for(int b=0;b<ubu.size();b++)
    {
        dijkstra(ubu[b]);
    }
    for(int i=0;i<k;i++)
    {
        dp[i][(1<<i)]=cost[1][ubu[i]];
    }
    for(int mask=1;mask<doi[k];mask++)
    {
        for(int y=0;y<k;y++)
        {
            int minim=INF;
            if(mask&(1<<y))
            {
                int mask1=mask^(1<<y);
                for(int x=0;x<k;x++)
                    if(mask1&(1<<x))
                    {
                        minim=min(minim,dp[x][mask1]+cost[ubu[x]][ubu[y]]);
                    }
            }
            if(dp[y][mask]==0)
                dp[y][mask]=minim;
        }
    }
    int minim=INF;
    for(int i=0;i<k;i++)
    {
        minim=min(minim,dp[i][doi[k]-1]+cost[ubu[i]][n]);
    }
    fout<<minim;
    return 0;
}
void dijkstra(int b)
{
    set <pair<int,int> > s;
    s.insert({0,b});
    for(int i=1;i<=n;i++)
        cost[b][i]=INF;
    cost[b][b]=0;
    while(s.size())
    {
        int minim=(*s.begin()).first,x=(*s.begin()).second;
        s.erase(s.begin());
        for(int i=0;i<v[x].size();i++)
        {
            int vf=v[x][i].first,c=v[x][i].second;
            if(minim+c<cost[b][vf])
            {
                s.erase({cost[b][vf],vf});
                cost[b][vf]=minim+c;
                s.insert({cost[b][vf],vf});
            }
        }
    }

}