Cod sursa(job #1317393)

Utilizator gapdanPopescu George gapdan Data 14 ianuarie 2015 21:05:13
Problema Ubuntzei Scor 25
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.94 kb
#include<cstdio>
#include<queue>
#define INF 999999999
#define NMAX 2005
using namespace std;
int n,m,k,i,x,y,c,s,j,K;
int o[30],d[30][30],cst[50];
int dp[20][1<<15];
typedef pair<int,int>pp;
priority_queue<pp,vector<pp>,greater<pp> >q;
vector<pp>v[NMAX];

void djikstra(int nr)
{
    int i;
    for (i=1;i<=n;++i) cst[i]=INF;
    q.push(pp(o[nr],0));
    cst[o[nr]]=0;
    while(!q.empty())
    {
        pp X=q.top();
        q.pop();
        int x=X.first, c=X.second;
        if (c>cst[x]) continue;
        for (i=0; i<v[X.first].size(); ++i)
        {
            int it=v[x][i].first;
            int cost=v[x][i].second;
            if (cst[it] > cst[x]+cost)
            {
                cst[it]=cst[x]+cost;
                q.push(pp(it,cst[it]));
            }
        }
    }
    for (i=0;i<=k+1;++i) d[nr][i]=cst[o[i]];
}
int main()
{
    freopen("ubuntzei.in","r",stdin);
    freopen("ubuntzei.out","w",stdout);
    scanf("%d%d",&n,&m);
    scanf("%d",&k);
    for (i=1;i<=k;++i) scanf("%d",&o[i]);
    o[0]=1;o[k+1]=n;
    for (i=1;i<=m;++i)
    {
        scanf("%d%d%d",&x,&y,&c);
        v[x].push_back(pp(y,c));
        v[y].push_back(pp(x,c));
    }
    for (i=0;i<=k+1;++i)
        djikstra(i);
    if (k==0) {printf("%d\n",d[0][k+1]);}
    else
    {
        int S=(1<<k);
        for (i=0;i<=k+1;++i)
            for (j=0;j<S;++j) dp[i][j]=INF;
        dp[0][0]=0;
        for (s=0;s<S;++s)
            for (j=0;j<=k;++j)
                if (dp[j][s]!=INF)
                {
                    for (i=1;i<=k;++i)
                    {
                        x=1<<(i-1);
                        if ((s & x)==0)
                            dp[i][1<<(i-1)|s]=min(dp[i][1<<(i-1)|s],dp[j][s]+d[j][i]);
                    }
                }
        int Min=INF;
        for (i=1;i<=k;++i)
            Min=min(Min,dp[i][S-1]+d[i][k+1]);
        printf("%d\n",Min);
    }
    return 0;
}