Cod sursa(job #1724604)

Utilizator LucianTLucian Trepteanu LucianT Data 3 iulie 2016 16:40:20
Problema Ubuntzei Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.73 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> ,vector<pair<int,int> >, greater<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 (i=1;i<(1<<k);++i){
        for (j=0;j<k;++j){
            if (i&(1<<j)){
                for ( int p=0;p<k;++p){
                    if (p!=j && (i&(1<<p)))
                        dp[i][j]=min (dp[i][j],dp[i^(1<<j)][p]+dist[p][g[j]]);
                }
            }
        }
    }
    int Sol=INF;
    for (int i=0;i<k;++i)
        Sol=min(Sol,dp[(1<<k)-1][i]+dist[i][n]);
    printf ("%d",Sol);
    return 0;
}