Cod sursa(job #3198408)

Utilizator Cazacu2006RazvanRazvan Cazacu Cazacu2006Razvan Data 29 ianuarie 2024 11:11:55
Problema Ubuntzei Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.55 kb
#include <fstream>
#include <vector>
#include <queue>
#include <cstring>
#define inf 10000001
using namespace std;
ifstream fin("ubuntzei.in");
ofstream fout("ubuntzei.out");
int n,m,k,v[16],d[32768][16],dist[16][16],disti[16],distf[16],x,y,z,dp[2001],distif;
struct muchie
{
    int nod,cost;
};
vector <muchie> A[2001];

struct cmp
{
    bool operator () (const muchie& a, const muchie& b )
    {
        return a.cost>b.cost;
    }
};
void distanta(int nod,int tip,int nr)
{
    priority_queue <muchie, vector<muchie> ,cmp> q;
    q.push({nod,0});
    for(int i=1;i<=n;i++)
        dp[i]=inf;
    dp[nod]=0;
    while(!q.empty())
    {
        muchie nodc=q.top();
        q.pop();
        int x=nodc.nod;
        int dist=nodc.cost;
        if(dist!=dp[x])
            continue;
        for(auto i:A[x])
        {
            if(dp[i.nod]>dp[x]+i.cost)
            {
                dp[i.nod]=dp[x]+i.cost;
                q.push({i.nod,dp[i.nod]});
            }
        }
    }
    for(int i=1;i<=k;i++)
    {
        if(nod!=v[i])
        {
            if(tip==0){
            dist[i][nr]=dp[v[i]];
            dist[nr][i]=dp[v[i]];
            }
            else if(tip==1)
            {
                disti[i]=dp[v[i]];

            }
            else{
                distf[i]=dp[v[i]];

            }
        }
    }

    if(tip==1){

        distif=dp[n];
    }
}
int main()
{
    fin>>n>>m;
    fin>>k;
    for(int i=1;i<=k;i++)
    {
        fin>>v[i];
    }
    for(int i=1;i<=m;i++)
    {
        fin>>x>>y>>z;
        A[x].push_back({y,z});
        A[y].push_back({x,z});

    }
    distanta(1,1,0);
    distanta(n,2,0);
    for(int i=1;i<=k;i++)
        distanta(v[i],0,i);
        int l=(1<<k)-1;
    for(int i=1;i<=l;i++)
    {
       for(int p=1;p<=k;p++)
        d[i][p]=inf;
    }
    for(int i=1;i<=k;i++)
    {
        d[(1<<(i-1))][i]=disti[i];
    }


    for(int i=1;i<=l;i++)
    {
        for(int p=1;p<=k;p++)
        {
            if((i>>(p-1))&1)
            {
                for(int p2=1;p2<=k;p2++)
                {
                    if(!((i>>(p2-1))&1))
                    {
                        int j=i+(1<<(p2-1));
                        d[j][p2]=min(d[j][p2],d[i][p]+dist[p][p2]);
                    }
                }
            }
        }
    }
    int minim=inf;
    for(int i=1;i<=k;i++)
    {
        minim=min(minim,d[l][i]+distf[i]);
    }
    if(k==0)
    {
        minim=distif;
    }

    fout<<minim;

    return 0;
}