Cod sursa(job #2698002)

Utilizator Iustin01Isciuc Iustin - Constantin Iustin01 Data 20 ianuarie 2021 17:18:00
Problema Ubuntzei Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.37 kb
#include <bits/stdc++.h>
#define oo (1 << 30)
using namespace std;

ifstream in("ubuntzei.in");
ofstream out("buntzei.out");

long long int n, m, x, y, cost, p, summin = oo , sum, sum2;
long long int d[2005][2005], v[20], sol[20];
bitset < 2005 > c;

void bkt(int k){
    for(int i = 1; i <= p; i++)
    if(!c[v[i]]){
        sol[k] = v[i];
        if(k == 1)
            sum += d[1][v[i]];
        else
            sum += d[v[i - 1]][v[i]];
        c[sol[k]] = true;
        if(k <= p){
            if(k == p)
              sum +=  d[sol[p]][n],  summin = min(summin, sum);
            else
                bkt(k + 1);
        }
        c[sol[k]] = false;
        if(k == 1)
            sum -= d[1][sol[k]];
        else
            sum -= d[sol[k - 1]][sol[k]];
    }
}

int main(){
    in>>n>>m;
    in>>p;
    for(int i = 1; i <= p; i++)
        in>>v[i];
    while(m--){
        in>>x>>y>>cost;
        d[x][y] = cost;
        d[y][x] = cost;
    }
    for(int i = 1; i <= n; i++)
        for(int j = 1; j <= n; j++)
            if(!d[i][j])
                d[i][j] = oo;
    for(int k = 1; k <= n; k++)
        for(int i = 1; i <= n; i++)
            for(int j = 1; j <= n; j++)
            if(d[i][j] > d[i][k] + d[k][j])
                d[i][j] = d[i][k] + d[k][j];

    if(!p)
        summin = d[1][n];
    bkt(1);
    out<<summin;
}