Cod sursa(job #1918622)

Utilizator hegedusPaul Hegedus hegedus Data 9 martie 2017 16:15:09
Problema Ubuntzei Scor 20
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.7 kb
#include <cstdio>
#include <vector>
#define nmax 2001
#define infinit 2000000000
using namespace std;

unsigned int n,m,l,x,y,i,j,j1,k,dist,dmin;
int d[nmax][nmax],loc[16],v[10000];
vector <int> a[nmax];
bool viz[16];

void citire()
{
    freopen("ubuntzei.in","r",stdin);
    freopen("ubuntzei.out","w",stdout);
    scanf("%d%d%d",&n,&m,&l);
    for(x=1;x<=l;x++) scanf("%d",&loc[x]);
    for(i=1;i<=n;i++)
        for(j=1;j<=n;j++)
            if(i!=j) d[i][j]=infinit;
    for(x=1;x<=m;x++)
    {
        scanf("%d%d%d",&i,&j,&dist);
        a[i].push_back(j);
        a[j].push_back(i);
        d[i][j]=dist;
        d[j][i]=dist;
    }
}

void dijkstra(int i)
{
    k=a[i].size();
    for(x=1;x<=k;x++)
        v[x]=a[i][x-1];
    for(x=1;x<=k;x++)
    {
        j=v[x];
        for(y=0;y<a[j].size();y++)
        {
            j1=a[j][y];
            if(d[i][j1]>d[i][j]+d[j][j1])
            {
                d[i][j1]=d[i][j]+d[j][j1];
                d[j1][i]=d[i][j1];
                v[++k]=j1;
            }
        }
    }
}

void backtracking(unsigned int k)
{
    if(k==l+1)
    {
       dist+=d[loc[v[k-1]]][n];
       if(dist<dmin) dmin=dist;
    }
    else
    for(unsigned int x=1;x<=l;x++)
        if(!viz[x])
        {
            viz[x]=1;
            v[k]=x;
            int i=loc[v[k]];
            int j=loc[v[k-1]];
            dist+=d[i][j];
            if(dist<dmin) backtracking(k+1);
            dist-=d[i][j];
            viz[x]=0;
        }
}

int main()
{
    citire();
    for(i=1;i<=n;i++)
        dijkstra(i);

    loc[0]=1;
    dmin=infinit;
    dist=0;
    backtracking(1);
    printf("%d\n",dmin);
    return 0;
}