Cod sursa(job #1128857)

Utilizator Vladinho97Iordan Vlad Vladinho97 Data 27 februarie 2014 19:00:50
Problema Ubuntzei Scor 50
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.61 kb
#include <cstdio>
#include <vector>
#include <cmath>
#define inf 2000000
using namespace std;
struct vecini
{
    vector <int> v;
};
vecini g[2009];
int c[20],a[2009][2009],dp[2009][2009];
int main()
{
    int n,m,i,j,k,nr,x,y,z,l;
    freopen("ubuntzei.in","r",stdin);
    freopen("ubuntzei.out","w",stdout);
    scanf("%d%d",&n,&m);
    scanf("%d",&l);
    for(i=1;i<=l;i++)
        scanf("%d",&c[i]);
    int calcul= pow((double)2,(double)l)-1;
    for(i=1;i<=m;i++)
    {
        scanf("%d%d%d",&x,&y,&z);
        a[x][y]=z;
        a[y][x]=z;
    }
    for(k=1;k<=n;k++)
    {
        for(i=1;i<=n;i++)
            for(j=i+1;j<=n;j++)
                if(a[i][k]!=0&&a[j][k]!=0)
                    if(a[i][k]+a[k][j]<a[i][j]||a[i][j]==0)
                    {
                        a[i][j]=a[i][k]+a[k][j];
                        a[j][i]=a[i][k]+a[k][j];
                    }
    }
    k=l;
    if(k==0)
        printf("%d",a[1][n]);
    else
    {
        for(i=1;i<=n;i++)
            dp[i][0]=a[1][i];
        for(i=1;i<=n;i++)
            for(nr=1;nr<=calcul;++nr)
                {
                    dp[i][nr]=inf;
                }
        for(nr=1;nr<=calcul;nr++)//submultimea
            for(i=1;i<=n;i++)
                for(j=1;j<=k;j++)
                    if(((1<<(j-1))&nr)!=0)
                    {
                        int x=pow(2,(double)j-1);
                        if(dp[i][nr]>dp[c[j]][nr-x]+a[i][c[j]])
                            dp[i][nr]=dp[c[j]][nr-x]+a[i][c[j]];
                    }
        printf("%d\n",dp[n][calcul]);
    }

    return 0;
}