Cod sursa(job #2446754)

Utilizator AlexBolfaAlex Bolfa AlexBolfa Data 10 august 2019 17:28:32
Problema Ubuntzei Scor 20
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.93 kb
#include <bits/stdc++.h>
#define MAX 2004
using namespace std;
ifstream fin("ubuntzei.in");
ofstream fout("ubuntzei.out");
typedef pair <int, int> pairINT;

int n,nrc,city[20],dist[MAX][MAX],dp[(1<<16) + 4][20];
bool used[MAX];
vector <pairINT> g[MAX];
set <pairINT> pQ;

void read();
void solve();
void dijkstra(int);

int main(){
    read();
    solve();
    fout<<dp[(1<<nrc)-1][nrc-1];
    return 0;
}
void solve(){
    int i,j,k;
    dijkstra(1);
    for(i=0;i<nrc;++i)
        dijkstra(city[i]);

    city[nrc++]=n;

    for(i=1;i<(1<<nrc);++i){
        for(j=0;(1<<j)<=i;++j){
            if(i & (1<<j)){
                if((1<<j) == i){
                    dp[i][j]=dist[1][city[j]];
                    break;
                }
                dp[i][j]=2e9;
                for(k=0;k<nrc;++k){
                    if(k!=j)
                        dp[i][j]=min(dp[i][j], dp[i-(1<<j)][k] + dist[city[k]][city[j]]);
                }
            }
        }
    }
}
void dijkstra(int org){
    int i,node,d;
    memset(used, 0, sizeof used);

    for(i=1;i<=n;++i)
        dist[org][i]=2e9;
    dist[org][org]=0;

    pQ.insert({0, org});

    while(!pQ.empty()){
        d=(*pQ.begin()).first;
        node=(*pQ.begin()).second;
        pQ.erase(pQ.begin());

        used[node]=0;

        for(auto it:g[node]){
            if(dist[org][it.first] > d + it.second){
                if(used[it.first])
                    pQ.erase(pQ.find({dist[org][it.first], it.first}));
                used[it.first]=1;
                dist[org][it.first] = d + it.second;
                pQ.insert({dist[org][it.first],it.first});
            }
        }
    }
}
void read(){
    int i,m,x,y,cost;
    fin>>n>>m>>nrc;
    for(i=0;i<nrc;++i){
        fin>>city[i];
    }
    for(i=0;i<m;++i){
        fin>>x>>y>>cost;
        g[x].push_back({y, cost});
        g[y].push_back({x, cost});
    }
}