Cod sursa(job #2500665)

Utilizator BaraianTudorBaraian Tudor Stefan BaraianTudor Data 28 noiembrie 2019 14:35:18
Problema Ubuntzei Scor 80
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.03 kb
#include <iostream>
#include <fstream>
#include <vector>
#include <queue>
#include <cstring>
using namespace std;
ifstream in("ubuntzei.in");
ofstream out("ubuntzei.out");
int n,m,k,a1,b,c,a[16],dp[(1<<16)][16],dist[2005],dmin[16][16];
struct eee
{
    int nod,cost;
    bool operator <(const eee &a)const
    {
        return cost>a.cost;
    }
};
vector <eee> v[2005];
priority_queue<eee> q;
int dijkstra(int x1)
{
    int x,y;
    memset(dist,0x3f3f3f3f,sizeof dist);
    dist[x1]=0;
    q.push({x1,0});
    while(!q.empty())
    {
        x=q.top().nod;
        y=q.top().cost;
        q.pop();
        if(dist[x]!=y)continue;
        for(auto i:v[x])
        {
            if(dist[i.nod]>dist[x]+i.cost)
            {
                dist[i.nod]=dist[x]+i.cost;
                q.push({i.nod,dist[i.nod]});
            }
        }
    }
}
int main()
{
    int inf=0x3f3f3f3f;
    in>>n>>m>>k;
    for(int i=0;i<k;i++)
    {
        in>>a[i];
    }
    for(int i=1;i<=m;i++)
    {
        in>>a1>>b>>c;
        v[a1].push_back({b,c});
        v[b].push_back({a1,c});
    }
    for(int i=1;i<=(1<<(k))-1;i++)
    {
        for(int j=0;j<k;j++)
        {
            dp[i][j]=inf;
        }
    }
    dijkstra(1);
    for(int i=0;i<k;i++)
    {
        dp[(1<<i)][i]=dist[a[i]];
    }
    for(int i=0;i<k;i++)
    {
        dijkstra(a[i]);
        for(int j=0;j<k;j++)
        {
            if(i!=j)
            {
                dmin[i][j]=dist[a[j]];
            }
        }
    }
    for(int i=1;i<((1<<k)-1);i++)
    {
        for(int j=0;j<k;j++)
        {
            if(i&(1<<j))
            for(int t=0;t<k;t++)
            {
                if(!(i&(1<<t)))
                {
                    dp[i+(1<<t)][t]=min(dp[i+(1<<t)][t],dp[i][j]+dmin[j][t]);
                }
            }
        }
    }
    int minim=inf;
    for(int i=0;i<k;i++)
    {
        dijkstra(a[i]);
        minim=min(minim,dp[((1<<k)-1)][i]+dist[n]);
    }
    out<<minim;
    return 0;
}