Cod sursa(job #3002822)

Utilizator Razvan_GabrielRazvan Gabriel Razvan_Gabriel Data 15 martie 2023 11:21:40
Problema Ubuntzei Scor 50
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.21 kb
#include <iostream>
#include <fstream>
#include <queue>
#include <vector>
#include <bitset>
#include <cstring>
#include <queue>

using namespace std;

const int NMAX = 2001;
const int BMAX = 1024;
const int INF = 2 * 1e9 + 1;

vector <pair <int, int> > a[NMAX];
int prieteni[NMAX];
int d[NMAX][BMAX];

struct Nod
{
    int cost, id, bitmask;
};

class Compare
{
    public:
        bool operator()(Nod a, Nod b)
        {
            return a.cost > b.cost;
        }
};

void dijkstra()
{
    priority_queue <Nod, vector<Nod>, Compare> pq;

    d[1][0] = 0;
    Nod nn = {0, 1, 0};
    pq.push(nn);
    while(!pq.empty())
    {
        Nod n = pq.top();
        pq.pop();

        for(auto y: a[n.id])
        {
            int newbitmask = n.bitmask;

            if(prieteni[y.first] != -1)
            {
                int vid = prieteni[y.first];
                newbitmask = newbitmask | (1<<vid);
            }

            int c = y.second + n.cost;
            if(c < d[y.first][newbitmask])
            {
                d[y.first][newbitmask] = c;
                pq.push({c, y.first, newbitmask});
            }
        }
    }
}

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

    int n, m;
    fin >> n >> m;

    int k;
    fin >> k;

    for(int i = 0; i <= n; i++)
        prieteni[i] = -1;

    for(int i = 0; i < k; i++)
    {
        int x;
        fin >> x;
        prieteni[x] = i;
    }

    for(int i = 0; i <= n; i++)
        for(int j = 0; j <= 1<<k; j++)
            d[i][j] = INF;
    //memset(d, INF, NMAX * BMAX * sizeof(int));

    for(int i = 1; i <= m; i++)
    {
        int x, y, c;
        fin >> x >> y >> c;
        a[x].push_back(make_pair(y, c));
        a[y].push_back(make_pair(x, c));
    }

    /*for(int i = 1; i <= n; i++)
    {
        for(int j = 0; j <= 1<<k; j++)
            fout << d[i][j] << " ";
        fout << "\n";
    }
    fout << "\n";*/

    dijkstra();

    /*for(int i = 1; i <= n; i++)
    {
        for(int j = 0; j <= 1<<k; j++)
            fout << d[i][j] << " ";
        fout << "\n";
    }*/

    fout << d[n][(1<<k) - 1];



    return 0;
}