Cod sursa(job #2426211)

Utilizator bluestorm57Vasile T bluestorm57 Data 26 mai 2019 19:02:26
Problema Ubuntzei Scor 85
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.09 kb
#include <bits/stdc++.h>

using namespace std;

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

const int inf = INT_MAX;
const int NMAX = 1005;
const int KMAX = 18;
int cost[NMAX][NMAX],frd[KMAX],n,m,k,dp[KMAX][1 << KMAX];
bool viz[NMAX];
vector < pair < int, int> > v[NMAX];
priority_queue < pair <int, int > > q;

void dijkstra(int start){
    int i,nod,sz;
    for(i = 1 ; i <= n ; i++)
        viz[i] = 0;
    cost[start][start] = 0;
    q.push(make_pair(0,start));
    while(!q.empty()){
        nod = q.top().second;
        q.pop();
        if(viz[nod])
            continue;
        sz = v[nod].size();
        for(i = 0 ; i < sz ; i++)
            if(cost[start][v[nod][i].first] > cost[start][nod] + v[nod][i].second){
                cost[start][v[nod][i].first] = cost[start][nod] + v[nod][i].second;
                q.push(make_pair(-cost[start][v[nod][i].first], v[nod][i].first));
            }
        viz[nod] = 1;
    }

}

int main(){
    int i,j,a,b,c;
    f >> n >> m >> k;
    for(i = 1 ; i <= k ; i++)
        f >> frd[i];
    for(i = 1 ; i <= m ; i++){
        f >> a >> b >> c;
        v[a].push_back(make_pair(b,c));
        v[b].push_back(make_pair(a,c));
    }
    for(i = 1 ; i <= n ; i++)
        for(j = 1 ; j <= n ; j++)
            cost[i][j] = inf;

    k += 2;
    frd[0] = 1;
    frd[k - 1] = n;
    for(i = 0 ; i < k ; i++)
        dijkstra(frd[i]);

    /*for(i = 1 ; i <= n ; i++){
        for(j = 1 ; j <= n ; j++)
            g << cost[i][j] << " ";
        g << "\n";
    }*/
    int lim = (1 << k) - 1;
    for ( i = 1; i<= lim; i++)
        for ( j = 0; j<k; j++)
            dp[j][i] = inf;

    //dp[1][0] = 0;

    for ( i = 0; i<k; i++)
        dp[i][1 << i] = cost[1][frd[i]];

    for(i = 1 ; i <= lim ; i++)
        for(j = 0 ; j < k ; j++)
            if(i & (1 << j)){
               for (int z = 0; z<k; z++)
                    if (!((1<<(z))&i))
                        dp[z][i^(1<<(z))] = min(dp[z][i^(1<<(z))],dp[j][i]+cost[frd[j]][frd[z]]);
            }

    g << dp[k-1][lim];
    return 0;
}