Pagini recente » Istoria paginii utilizator/zangetsu2201 | Cod sursa (job #392828) | Cod sursa (job #111046) | Cod sursa (job #1863092) | Cod sursa (job #3199831)
/// Aceasta sursa este pentru problema
/// https://www.infoarena.ro/problema/ubuntzei
/// Punctaj: 60
/// Grupa de seniori
#include <fstream>
#include <climits>
#include <vector>
#include <queue>
#define DIM 2001
using namespace std;
ifstream fin("ubuntzei.in");
ofstream fout("ubuntzei.out");
vector <pair<int, int>> adj[DIM + 1];
priority_queue <pair<int, int>, vector <pair<int, int>>, greater <pair<int, int>>> pq;
int dist[20][DIM];
int loc[20];
int n, m;
void djk( int s ){
for(int i = 1; i <= n; i++)
dist[s][i] = INT_MAX;
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 muchie{
int next;
int costmuchie;
};
vector <muchie> g[DIM];
int dp[(1<<17) + 1][DIM];
int main()
{
int k;
fin >> n >> m >> k;
for( int i = 1; i <= k; i++ )
fin >> loc[i];
loc[0] = 1;
loc[k+1] = n;
for( int i = 0; i < m; i++ ){
int a, b, c;
fin >> 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] = INT_MAX;
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] == INT_MAX)
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]]);
}
}
}
fout << dp[(1<<(k+2))-1][k+1];
return 0;
}