Cod sursa(job #2573944)

Utilizator cpopescu1Popescu Cristian cpopescu1 Data 5 martie 2020 19:35:35
Problema Ubuntzei Scor 45
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.44 kb
#include <bits/stdc++.h>
#define maxn 2005
#define inf 0x3f3f3f3f
using namespace std;
ifstream fin("ubuntzei.in"); ofstream fout("ubuntzei.out");
int d[maxn][maxn],pr[maxn];
int x[maxn];
int sol,mi=inf;
int n,m,k;
void read()
{
    for(int i=1;i<=n;i++)
        for(int j=1;j<=n;j++)
            if(i!=j)
                d[i][j]=inf;
    fin>>n>>m>>k;
    for(int i=1;i<=k;i++)
        fin>>pr[i];
    int x,y,cost;
    for(int i=1;i<=m;i++)
    {
        fin>>x>>y>>cost;
        d[x][y]=cost;
        d[y][x]=cost;
    }
}
void RoyWarshall()
{
    int i,j,a;
     for(a=1;a<=n;a++)
        for(i=1;i<=n;i++)
            for(j=1;j<=n;j++)
                if (d[i][a] && d[a][j] && (d[i][j] > d[i][a] + d[a][j] || d[i][j]==0) && i != j)
                  d[i][j] = d[i][a] + d[a][j];
}
bool ok(int k)
{
    for(int i=1;i<k;i++)
        if(x[i]==x[k])
            return false;
    return true;
}
void back(int p)
{
    if(p>k)
    {
        sol=0;
        sol+=d[1][x[1]];
        for(int i=1;i<k;i++)
            sol+=d[x[i]][x[i+1]];
        sol+=d[x[k]][n];
        if(sol<mi)
            mi=sol;
    }
    else
    {
        for(int i=1;i<=k;i++)
        {
            x[p]=pr[i];
            if(ok(p))
                back(p+1);
        }
    }
}
int main()
{
    read();
    RoyWarshall();
    if(k==0)
        fout<<d[1][n];
    else{
        back(1);
        fout<<mi;
    }
    return 0;
}