Cod sursa(job #2038394)

Utilizator georgerapeanuRapeanu George georgerapeanu Data 13 octombrie 2017 17:33:57
Problema Ubuntzei Scor 5
Compilator cpp Status done
Runda hlo_cj_av_l2 Marime 2.1 kb
#include <cstdio>
#include <cstdlib>
#include <algorithm>
#include <queue>
#include <vector>
using namespace std;
FILE *f=fopen("ubuntzei.in","r");
FILE *g=fopen("ubuntzei.out","w");
long long dist[2005][2005];
vector<pair<long long,long long> > G[2005];
priority_queue<pair<long long,long long> ,vector<pair<long long,long long> > ,greater<pair<long long,long long> > > H;
long long N,M,K;
long long dp[1<<15][20];
long long ceva[20];
int main()
{
    fscanf(f,"%lld%lld%lld",&N,&M,&K);
    for(long long i=1;i<=K;i++)fscanf(f,"%lld",&ceva[i]);
    for(long long i=1;i<=M;i++)
    {
        long long x,y,z;
        fscanf(f,"%lld %lld %lld",&x,&y,&z);
        G[x].push_back({y,z});
        G[y].push_back({x,z});
    }
    for(long long i=1;i<=N;i++)
    {
        for(long long j=1;j<=N;j++)dist[i][j]=1LL<<60;
        dist[i][i]=0;
        H.push({0,i});
        while(!H.empty())
        {
            long long nod=H.top().second;
            long long cost=H.top().first;
            H.pop();
            if(cost!=dist[i][nod])continue;
            for(auto it:G[nod])
                if(dist[i][it.first]>dist[i][nod]+it.second)
                {
                    dist[i][it.first]=dist[i][nod]+it.second;
                    H.push({dist[i][it.first],it.first});
                }
        }
    }
    for(long long i=0;i<(1<<K);i++)for(int j=0;j<=N;j++)dp[i][j]=1LL<<60;
    for(long long i=1;i<=K;i++)
    {
        dp[1<<(i-1)][ceva[i]]=dist[1][ceva[i]];
    }
    for(long long conf=2;conf<(1<<N);conf++)
    {
        for(int j=1;j<=K;j++)
        {
            if((conf>>(j-1))&1)
            {
                for(int k=1;k<=K;k++)
                {
                    dp[conf][ceva[j]]=min(dp[conf][ceva[j]],(dp[conf^(1<<(j-1))][ceva[k]]<=(1LL<<60)-dist[ceva[j]][ceva[k]] ? dp[conf^(1<<(j-1))][ceva[k]]+dist[ceva[k]][ceva[j]]:1LL<<60));
                }
            }
        }
    }
    long long rez=1LL<<60;
    for(int i=1;i<=K;i++)rez=min(rez,dp[(1<<K)-1][ceva[i]]+dist[ceva[i]][N]);
    fprintf(g,"%lld",rez);
    fclose(f);
    fclose(g);
    return 0;
}