Cod sursa(job #2700660)

Utilizator AnastasiaStefanescuAnastasia Stefanescu AnastasiaStefanescu Data 28 ianuarie 2021 13:19:53
Problema Ubuntzei Scor 20
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.63 kb

#include <fstream>
#include <math.h>
#include <set>
#include <queue>

using namespace std;

ifstream fin ("ubuntzei.in");
ofstream fout ("ubuntzei.out");

int dist[36001], n, f[36001], minim, m, k, sef[36001], oras[2001], a[2001][2001], permutare[2001], rez[2001];

vector <pair <int, int>> l[50001];
priority_queue<pair<int, int> > dist_min;

void floyd()
{
    int i, j, k;
    for (k = 1; k<= n; k++)
        for (i = 1; i<= n; i++)
            for (j = 1; j<= n; j++)
                if(a[i][j] > a[i][k] + a[k][j])
                    a[i][j] = a[i][k] + a[k][j];
}

void calc_dist_totala()
{
    int i, suma=0;
    for(i = 2; i<= k; i++)
        suma += a[permutare[i-1]][permutare[i]];
    
    suma += a[1][permutare[1]];
    suma += a[permutare[k]][n];
    
    if(suma < minim)
        minim = suma;
}


void bkt(int t) {
    int i;
    if(t == k+1)
        calc_dist_totala();
    else {
        for(i=1; i<=t; i++)
        {
            permutare[t] = oras[i];
            if(f[permutare[t]]==0)
            {
                f[permutare[t]]=1;
                bkt(t+1);
                f[permutare[t]]=0;
            }
        }
    }
}


int main()
{
    int C, i, j, x, y;
    fin >> n >> m >> k;
    
    for (i = 1; i<= k ;i++)
    fin >> oras[i];
    
    for (i = 1; i<= m; i++)
    {
        fin >> x >> y >> C;
        a[x][y] = a[y][x] = C;
    }
    for (i = 1; i<= n; i++)
        for (j = 1; j<= n; j++)
            if(i != j && a[i][j] == 0)
                a[i][j] = 1e9;
    
    floyd();
    
    if (k == 0)
    {
        fout << a[1][n];
        return 0;
    }
    minim = 1e9;
    bkt(1);
    
    fout << minim;
    
    return 0;
}