Cod sursa(job #1070982)

Utilizator horatiu11Ilie Ovidiu Horatiu horatiu11 Data 2 ianuarie 2014 14:04:38
Problema Ubuntzei Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.65 kb
//horatiu11
# include <cstdio>
# include <iostream>
# include <vector>
# include <queue>
# include <cstring>
# define nmax 2002
# define inf 2e9
# define kmax 21
using namespace std;
int c[kmax],n,m,k,x,K,y,z,D[kmax][nmax],l,DP[1<<kmax][kmax];
vector <pair <int,int> >G[nmax];
queue <int>q;
void bellman_ford(int x)
{
    int i;
    q.push(x);D[k][x]=0;
    while(!q.empty())
    {
        x=q.front();q.pop();
        for(i=0;i<G[x].size();++i)
            if(D[k][G[x][i].first] > D[k][x]+G[x][i].second)
            {
                D[k][G[x][i].first] = D[k][x]+G[x][i].second;
                q.push(G[x][i].first);
            }
    }
}
int main()
{
    int i,j,b;
    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",&c[i]);
    c[++K]=n;
    for(i=1;i<=m;++i)
    {
        scanf("%d%d%d",&x,&y,&z);
        G[x].push_back(make_pair(y,z));
        G[y].push_back(make_pair(x,z));
    }
    for(k=1;k<=K;++k)
    {
        for(j=1;j<=n;++j)
            D[k][j]=inf;
        bellman_ford(c[k]);
    }
    l=1<<K;
    for(i=0;i<l;++i)
        for(j=0;j<=K;++j)
            DP[i][j]=inf;
    k=K+1;
    for(i=1;i<=n;++i)
        D[k][i]=inf;
    bellman_ford(1);
    for(i=0;(1<<i)<l;++i)
        DP[1<<i][i]=D[K+1][c[i+1]];
    for(i=1;i<l;++i)
        for(j=0;j<K;++j)
            if(i&(1<<j))
                for( b=0;b<K;++b)
                    if (b!=j && (i&(1<<b)))
                        DP[i][j]=min(DP[i][j],DP[i ^ (1 << j)][b] + D[b + 1][c[j + 1]]);
    printf ("%d\n", DP[l - 1][K - 1]);
    return 0;
}