Cod sursa(job #3162738)

Utilizator suimerchantsui merchant suimerchant Data 29 octombrie 2023 19:24:57
Problema Ubuntzei Scor 80
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.19 kb
#include <bits/stdc++.h>
using namespace std;


ifstream fin("ubuntzei.in");
ofstream fout("ubuntzei.out");


int n,m,k;
const int INF = 2000000000;
const int kmax = (1 << 17) + 3;
const int nmax = 2005;
int a[20],cost[20][20],dp[kmax][20],D[nmax],ans;
vector < int > L[nmax];
vector < int > C[nmax];
struct el
{
    int nod,cost;
    bool operator < (const el &A) const
    {
        return cost > A.cost;
    }
};
priority_queue < el > q;


void read()
{
    fin>>n>>m>>k;
    for(int i=1;i<=k;i++) fin>>a[i];
    a[0]=1;
    a[++k]=n;
    int x,y,z;
    for(int i=1;i<=m;i++)
    {
        fin>>x>>y>>z;
        L[x].push_back(y);
        C[x].push_back(z);
        L[y].push_back(x);
        C[y].push_back(z);
    }
}


void dijkstra(int nod)
{
    el w,w2;
    w.nod=nod;
    w.cost=0;
    q.push(w);
    while(!q.empty())
    {
        w2=q.top();
        q.pop();
        for(int i = 0;i < L[w2.nod].size();i++)
        {
            int nnod = L[w2.nod][i];
            int ccost = C[w2.nod][i];
            if(D[nnod] > D[w2.nod] + ccost)
            {
                D[nnod]=D[w2.nod] + ccost;
                w.nod=nnod;
                w.cost=D[nnod];
                q.push(w);
            }
        }
    }
}


void build()
{
    for(int i=0;i<=k;i++)
    {
        for(int j=1;j<=n;j++) D[j]=INF;
        D[a[i]]=0;
        dijkstra(a[i]);
        for(int j=0;j<=k;j++)
        {
            cost[i][j]=D[a[j]];
        }
    }
}


void solve()
{
    int kp=(1 << k);
    for(int stare=1;stare<kp;stare++)
        for(int j=0;j<=k;j++)
        {
            dp[stare][j]=INF;
        }

    for(int i=0;i<=k;i++) dp[(1 << i)][i]=cost[0][i];


    for(int stare=1;stare<kp;stare++)
        for(int i=0;i<=k;i++)
            if(stare & (1 << i))
                for(int j=0;j<=k;j++)
                    if(!(stare & (1 << j)))
                        dp[stare | (1 << j)][j]=min(dp[stare | (1 << j)][j],dp[stare][i]+cost[i][j]);
    ans=INF;
    for(int i=1;i<k;i++)
    {
        ans=min(ans,dp[kp-1][i]+cost[i][k]);
    }
    fout<<ans;
}


int main()
{
    read();
    build();
    solve();
    return 0;
}