Cod sursa(job #3193206)

Utilizator dobreraduDobre Radu Fabian dobreradu Data 14 ianuarie 2024 13:00:40
Problema Ubuntzei Scor 55
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.94 kb
#include <bits/stdc++.h>

using namespace std;
ifstream in("ubuntzei.in");
ofstream out("ubuntzei.out");
const int NMAX = 2001;
const int INF = 2e9;

vector <pair<int, int>> adj[NMAX + 1];
priority_queue <pair<int, int>, vector <pair<int, int>>, greater <pair<int, int>>> pq;
int dist[20][NMAX];
int loc[20];
int n, m;

void djk( int s ){
	for(int i = 1; i <= n; i++)
		dist[s][i] = INF;
	dist[s][loc[s]] = 0;
	pq.push({dist[s][loc[s]], loc[s]});
	while(!pq.empty()){
		int nod = pq.top().second;
		pq.pop();
        for(auto vec : adj[nod]){
            if( dist[s][vec.first] > dist[s][nod] + vec.second){
                dist[s][vec.first] = dist[s][nod] + vec.second;
                pq.push({dist[s][vec.first], vec.first});
            }
        }
	}
}
struct Radu{
    int next, costmuchie;
};
vector <Radu> g[NMAX];
int dp[(1<<17) + 1][NMAX];

int main()
{
    int k;
    in >> n >> m >> k;
    for( int i = 1; i <= k; i++ )
        in >> loc[i];
    loc[0] = 1;
    loc[k+1] = n;
    for( int i = 0; i < m; i++ ){
        int a, b, c;
        in >> a >> b >> c;
        adj[a].push_back({b, c});
        adj[b].push_back({a, c});
    }

    for( int i = 0; i <= k+1; i++ )
        djk(i);

    for( int config = 1; config < (1 << (k+2)); config++ )
        for( int curnode = 0; curnode <= k+1; curnode++ )
            dp[config][curnode] = INF;
    dp[1][0] = 0;
    for( int config = 1; config < (1 << (k+2)); config++ ){
        for( int curnode = 0; curnode <= k+1; curnode++ ){
            if( ( config & (1 << curnode)) == 0 || dp[config][curnode] == INF)
               continue;
            for( int i = 0; i <= k+1; i++ ){
                if( (config & (1 << i)) == 0 )
                    dp[config | (1 << i)][i] = min( dp[config | (1 << i)][i],
                        dp[config][curnode] + dist[curnode][loc[i]]);
            }
        }
    }
    out << dp[(1<<(k+2))-1][k+1];
    return 0;
}