Cod sursa(job #2939215)

Utilizator TeodoraMaria123Serban Teodora Maria TeodoraMaria123 Data 13 noiembrie 2022 12:05:45
Problema Ubuntzei Scor 20
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.34 kb
#include <fstream>
#include <vector>
#include <bitset>

using namespace std;

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

#define MAX_N 2000
#define INF 1000000000
#define MAX_K 15

int n, m, friendsNo, minimumDist = INF, dist;
int graph[MAX_N + 1][MAX_N + 1];
int st[MAX_K];
vector <int> friends;
bitset <MAX_K> used;

void initializeGraph()
{
    for(int i = 1; i <= n ; i ++)
    {
        for(int j = 1; j <= n ; j ++)
            graph[i][j] =INF;
    }
    for(int i = 1; i <= n ; i++)
        graph[i][i] = 0;
}

void readGraph()
{
    friends.resize(friendsNo);
    for(int i = 0; i < friendsNo; i++)
    {
        int x;
        in >> x;
        friends[i] = x;
    }
    for(int i = 0; i < m ; i ++)
    {
        int a, b, c;
        in >> a >> b >> c;
        graph[a][b] = c;
        graph[b][a] = c;
    }
}

void BellmanFord()
{
    for(int k = 1; k <= n ; k ++)
    {
        for(int i = 1; i <= n ; i++)
        {
            for(int j = 1; j <= n; j ++)
            {
                if(graph[i][k] != INF  && graph[k][j] != INF)
                    graph[i][j] = min(graph[i][j], graph[i][k] + graph[k][j]);
            }
        }
    }
}


void print()
{
    for(int i = 1; i <= n; i++)
    {
        for(int j = 1; j <= n; j ++)
            out << graph[i][j] << " ";
        out << "\n";
    }
}

void bkt(int k)
{
    if(k == friendsNo)
    {
        dist += graph[friends[st[k - 1]]][n];
        minimumDist = min(dist, minimumDist);
//        out << dist << "\n";
        return;
    }
    for(int i = 0; i < friendsNo; i ++)
    {
        if(!used[i])
        {
            st[k] = i;
            used[i] = 1;
            dist += graph[friends[st[k - 1]]][friends[st[k]]];
            bkt(k + 1);
            used[i] = 0;
            dist -= graph[friends[st[k - 1]]][friends[st[k]]];
        }
    }
}

void solve()
{
    for(int i = 0; i < friendsNo; i ++)
    {
        st[0] = i;
        used[i] = 1;
        dist = graph[1][friends[i]];
        bkt(1);
        used[i] = 0;
    }

    out << minimumDist;
}
int main()
{
    in >> n>> m >> friendsNo;

    initializeGraph();

    readGraph();

    BellmanFord();

//    print();

    if(friendsNo == 0)
        out << graph[1][n];
    else
        solve();
    return 0;
}