Cod sursa(job #1448196)

Utilizator Burbon13Burbon13 Burbon13 Data 6 iunie 2015 14:07:41
Problema Ubuntzei Scor 25
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.96 kb
#include <cstdio>
#include <vector>
#include <queue>
#include <cstring>
#define nmx 2000
#define inf 0x3f3f3f3f
using namespace std;

int n, m, k, dist[nmx][17], sol[17], minim = inf;
bool viz[nmx];
vector <pair<int,int> > g[nmx];
vector <int> prieteni;
priority_queue <pair<int,int> > q;

void citire() {
    int nod1, nod2, cost;
    scanf("%d %d %d", &n, &m, &k);
    for(int i = 1; i <= k; ++i) {
        scanf("%d", &nod1);
        prieteni.push_back(nod1);
    }
    for(int i = 1; i <= m; ++i) {
        scanf("%d %d %d", &nod1, &nod2, &cost);
        g[nod1].push_back(make_pair(nod2,cost));
        g[nod2].push_back(make_pair(nod1,cost));
    }
}

void dijkstra(const int nod_porire, const int p) {
    dist[nod_porire][p] = 0;
    q.push(make_pair(0,nod_porire));
    int nod;
    while(not q.empty()) {
        nod = q.top().second;
        q.pop();
        for(vector<pair<int,int> >::iterator it = g[nod].begin(); it != g[nod].end(); ++it)
            if(dist[it->first][p] > dist[nod][p] + it->second) {
                dist[it->first][p] = dist[nod][p] + it->second;
                q.push(make_pair(-dist[it->first][p],it->first));
            }
    }
}

void verif(){
    int sum = dist[prieteni[sol[0]-1]][0];
    for(int i = 1; i < k; ++i)
        sum += dist[prieteni[sol[i]-1]][sol[i-1]];
    sum += dist[n][sol[k-1]];
    minim = minim > sum ? sum : minim;
}

void aranj(const int pos) {
    if(pos == k) {
        verif();
        return;
    }
    for(int i = 1; i <= k; ++i)
        if(not viz[i]) {
            viz[i] = 1;
            sol[pos] = i;
            aranj(pos + 1);
            viz[i] = 0;
        }
}

int main() {
    freopen("ubuntzei.in", "r", stdin);
    freopen("ubuntzei.out", "w", stdout);
    citire();
    memset(dist, inf, sizeof(dist));
    dijkstra(1,0);
    for(int i = 0; i < k; ++i)
        dijkstra(prieteni[i],i+1);
    aranj(0);
    printf("%d\n", minim);
    return 0;
}