Cod sursa(job #2543150)

Utilizator victorzarzuZarzu Victor victorzarzu Data 10 februarie 2020 21:36:46
Problema Ubuntzei Scor 35
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.16 kb
#include <bits/stdc++.h>

using namespace std;
ifstream f("ubuntzei.in");
ofstream g("ubuntzei.out");
long long n,m,k,x,y,cost,ans = INFINITY,dist;
vector<int> c;
long long a[2001][2001];

void Read()
{
    f>>n>>m;
    f>>k;
    for(int i = 1;i <= k;++i)
    {
        f>>x;
        c.push_back(x);
    }
    for(int i = 1;i <= m;++i)
    {
        f>>x>>y>>cost;
        a[x][y] = a[y][x] = cost;
    }
    f.close();
}

void roy_floyd()
{
    for(int h = 1;h <= n;++h)
        for(int i = 1;i <= n;++i)
            for(int j = 1;j <= n;++j)
                if(a[i][h] && a[h][j] && (a[i][j] > a[i][h] + a[h][j] || !a[i][j]) && i != j)
                    a[i][j] = a[j][i] = a[i][h] + a[h][j];
}

void Solve()
{
    if(k)
    {
        do{
            dist = a[1][c[0]];
            for(int i = 0;i < k - 1;++i)
                dist += a[c[i]][c[i + 1]];
            dist += a[c[k - 1]][n];
            if(dist < ans) ans = dist;
        }while(next_permutation(c.begin(),c.end()));
    }
    else
        ans = a[1][n];
    g<<ans;
    g.close();
}

int main()
{
    Read();
    roy_floyd();
    Solve();
    return 0;
}