Cod sursa(job #1724599)

Utilizator LucianTLucian Trepteanu LucianT Data 3 iulie 2016 16:35:41
Problema Ubuntzei Scor 70
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.62 kb
#include <bits/stdc++.h>
#define maxN 2004
#define maxK 18
#define INF 0x3f3f3f3f
using namespace std;
int n,m,i,j,k,x,y,z,mask;
vector<pair<int,int> >v[maxN];
int dp[(1<<maxK)][maxK],sol=INF;
int dist[maxK][maxN],g[maxK];
priority_queue<pair<int,int> > heap;
void dijkstra(int ind,int nod)
{
    int i;
    for(i=1;i<=n;i++)
        dist[ind][i]=INF;
    dist[ind][nod]=0;
    heap.push(make_pair(0,nod));
    while(!heap.empty())
    {
        x=heap.top().second;
        heap.pop();
        for(vector<pair<int,int> >::iterator it=v[x].begin();it!=v[x].end();it++)
            if(dist[ind][it->first]>dist[ind][x]+it->second)
            {
                dist[ind][it->first]=dist[ind][x]+it->second;
                heap.push(make_pair(dist[ind][it->first],it->first));
            }
    }
}
int main()
{
    freopen("ubuntzei.in","r",stdin);
    freopen("ubuntzei.out","w",stdout);
    scanf("%d %d %d",&n,&m,&k);
    for(i=1;i<=k;i++)
        scanf("%d",&g[i]);
    g[0]=1;
    for(i=1;i<=m;i++)
    {
        scanf("%d %d %d",&x,&y,&z);
        v[x].push_back(make_pair(y,z));
        v[y].push_back(make_pair(x,z));
    }
    k++;
    for(i=0;i<k;i++)
        dijkstra(i,g[i]);
    memset(dp,INF,sizeof(dp));
    dp[1][0]=0;
    for(mask=1;mask<(1<<k);mask++)
        for(i=0;i<k;i++)
            if(mask&(1<<i))
                for(j=0;j<k;j++)
                    if(j!=i && (mask&(1<<j)))
                        dp[mask][i]=min(dp[mask][i],dp[mask^(1<<i)][j]+dist[j][g[i]]);
    for(i=0;i<k;i++)
        sol=min(sol,dp[(1<<k)-1][i]+dist[i][n]);
    printf("%d",sol);
    return 0;
}