Cod sursa(job #1904725)

Utilizator Radu_GeorgeRadu George Radu_George Data 5 martie 2017 19:06:59
Problema Ubuntzei Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.71 kb
#include <bits/stdc++.h>
#define pii pair <int,int>
#define fi first
#define se second
#define pb push_back
#define mp make_pair
#define Nmax 2005
#define INF 1000000000

using namespace std;

int n,m,k,wh[20],dp[(1<<15)][20],D[Nmax],Dist[20][20];
vector <pii> L[Nmax];
priority_queue <pii> Q;

inline void Dijkstra(int nod)
{
    int i;
    pii w,w1;
    for(i=1;i<=n;++i) D[i]=INF;
    D[nod]=0; Q.push(mp(0,nod));
    while(!Q.empty())
    {
        w=Q.top(); Q.pop();
        for(auto it : L[w.se])
        {
            w1.se=it.fi;
            w1.fi=-w.fi+it.se;
            if(D[w1.se] > w1.fi)
            {
                D[w1.se] = w1.fi;
                Q.push(mp(-w1.fi,w1.se));
            }
        }
    }
}

int main()
{
    int x,y,z,i,j,t;
    ifstream cin("ubuntzei.in");
    ofstream cout("ubuntzei.out");
    cin>>n>>m>>k;
    for(i=1;i<=k;++i) cin>>wh[i];
    while(m--)
    {
        cin>>x>>y>>z;
        L[x].pb(mp(y,z));
        L[y].pb(mp(x,z));
    }

    for(i=0;i<(1<<k);++i)
        for(j=0;j<k;++j) dp[i][j]=INF;

    Dijkstra(1);
    if(!k)
    {
        cout<<D[n]<<"\n"; return 0;
    }
    for(i=0;i<k;++i) dp[(1<<i)][i]=D[wh[i+1]];

    for(i=0;i<k;++i)
    {
        Dijkstra(wh[i+1]);
        for(j=0;j<k;++j) Dist[i][j]=D[wh[j+1]];
    }

    for(i=0;i<(1<<k);++i)
        for(j=0;j<k;++j)
        {
            if(dp[i][j]==INF) continue;
            for(t=0;t<k;++t)
                if(!((1<<t)&i))
                    dp[(i|(1<<t))][t]=min(dp[(i|(1<<t))][t],dp[i][j]+Dist[j][t]);
        }

    Dijkstra(n);
    int ans=INF;
    for(j=0;j<k;++j) ans=min(ans,dp[(1<<k)-1][j]+D[wh[j+1]]);
    cout<<ans<<"\n";
    return 0;
}