Cod sursa(job #3341194)

Utilizator NeamtuMateiNeamtu Matei-Constantin NeamtuMatei Data 18 februarie 2026 13:21:16
Problema Ubuntzei Scor 50
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.35 kb
#include <iostream>
#include <fstream>
#include <vector>
#include <queue>
#include <map>
using namespace std;

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

typedef pair<int, int> pii;
const int MAXN = 2e3;
const int MAXM = 1e4;
const int MAXK = 15; // hmm
const int INF = 1e9;

int n, m, kc, cx, x, y, z, dmin;
int orase[MAXK+1];
int st[MAXN+1], viz[MAXN+1];

vector<pii> graf[MAXN+1];
vector<vector<int>> distante(MAXN+2, vector<int>(MAXN+2, INF));
map<int, bool> trebuie_vizitat;

void citire();
void afisdv();

void dijkstra(int init, vector<int> &dist) {
    priority_queue<pii, vector<pii>, greater<pii>> pq;

    dist[init] = 0;
    pq.push({ 0, init });

    while (!pq.empty()) {
        int nod = pq.top().second;
        int distInit = pq.top().first;
        pq.pop();

        if (distInit > dist[nod])
            continue;

        for (auto e: graf[nod]) {
            int nodExt = e.first;
            int cost = e.second;

            if (dist[nodExt] > dist[nod] + cost) {
                dist[nodExt] = dist[nod] + cost;
                pq.push({ dist[nodExt], nodExt });
            }
        }
    }
}


void bk(int k, int nod, int suma) {
    if (k == kc + 1) {
        dmin = min(dmin, suma + distante[nod][n]);
        return;
    }

    st[k] = nod;
    viz[nod] = true;

    for (int i = 1; i <= kc; i++) {
        if (!viz[orase[i]]) {
            bk(k + 1, orase[i], suma + distante[nod][orase[i]]);
        }
    }

    viz[nod] = false;
}

signed main() {
    citire();

    dijkstra(1, distante[1]);
    for (int i = 1; i <= kc; i++)
        dijkstra(orase[i], distante[ orase[i] ]);

    dmin = 2e9;
    // st[k] = 1, fr[1] = 1;

    bk(1, 1, 0);
    out << dmin;

    return 0;
}


void citire() {
    in >> n >> m >> kc;
    for (int i = 1; i <= kc; i++)
        in >> orase[i], trebuie_vizitat[orase[i]] = true;
    for (int i = 1; i <= m; i++) {
        in >> x >> y >> z;

        graf[x].push_back({y, z});
        graf[y].push_back({x, z});
    }
}

void afisdv() {
    for (int i = 1; i <= n; i++)
        cout << distante[1][i] << ' '; cout << '\n';

    for (int i = 1; i <= kc; i++) {
        for (int j = 1; j <= n; j++)
            cout << distante[orase[i]][j] << ' ';
        cout << '\n';
    }
}