Cod sursa(job #2060994)

Utilizator aeromaniaXRadoi Iulian aeromaniaX Data 8 noiembrie 2017 20:46:41
Problema Ubuntzei Scor 30
Compilator cpp Status done
Runda Arhiva de probleme Marime 2 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);
        scanf("%d",&x);
        if(x!=1) {
            v[1]=1;
            k++;
            v[2]=x;
            for(int i=3;i<=k;i++)
                scanf("%d",&v[i]);
        if(v[k]!=n)
            v[++k]=n;
        }
        else{
            v[1]=1;
            for(int i=2;i<=k;i++)

        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++)
//                {
//
//                }

        backit(2);
        printf("%d",Min);
    return 0;
}