Cod sursa(job #2061011)

Utilizator aeromaniaXRadoi Iulian aeromaniaX Data 8 noiembrie 2017 20:58:55
Problema Ubuntzei Scor 30
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.99 kb
#include <bits/stdc++.h>
using namespace std;


#define INF 999999999



int v[2003],ap[2003],sum[2003],x,y,c,m,n,p,L,xi,yi,k,st[2003],Min=INF;
int a[2003][2003];

bool valid(int k)
{
    if(sum[k-1]+(a[st[k]][st[k-1]])>Min)
        return 0;
    sum[k]=sum[k-1]+(a[st[k]][st[k-1]]);
    return 1;
}
bool sol(int p)
{
    if(p==k-1) return 1;
    return 0;
}

void backit(int p)
{
    for(int i=2;i<k;i++)
    {
        st[p]=v[i];
       if(ap[v[i]]==0){
                ap[v[i]]=1;
                if(valid(p)){
                    if(sol(p)){
                            sum[k]=sum[k-1]+(a[st[k-1]][n]);
                            if(sum[k]<Min)
                                Min=sum[k];
                    }
                    if(p<k-1)backit(p+1);
                }
        ap[v[i]]=0;
       }
    }
}
int main()
{
    freopen("ubuntzei.in","r",stdin);
    freopen("ubuntzei.out","w",stdout);

        scanf("%d%d",&n,&m);
        scanf("%d",&k);
        for(int i=1;i<=k;i++)
            scanf("%d",&v[i]);

        sort(v+1,v+k+1);
        if(v[1]!=1){
            for(int i=k+1;i>1;i--)
                v[i]=v[i-1];
                v[1]=1;
                k++;
        }
        if(v[k]!=n)
            v[++k]=n;



        for(int i=1;i<=n;i++)
            for(int j=1;j<=n;j++)
                if(i!=j)
                    a[i][j]=INF;

        for(int i=1;i<=m;i++)
        {
            scanf("%d%d%d",&x,&y,&c);
            a[x][y]=a[y][x]=c;
//            d[x][y]=d[y][x]=c;
        }


        for(int r=1;r<=n;r++)
            for(int i=1;i<=n;i++)
                for(int j=1;j<=n;j++)
                    a[i][j]=min(a[i][j],a[i][r] + a[r][j]);

        st[1]=1;
        st[k]=n;
//        for(int i=1;i<k;i++)
//            for(int j=i+1;j<=k;j++)
//                {
//
//                }
    if(k==0)
        printf("%d",a[1][n]);
    else{
        backit(2);
        printf("%d",Min);
    }
    return 0;
}