Pagini recente » Borderou de evaluare (job #757913) | Borderou de evaluare (job #176048) | Borderou de evaluare (job #1621528) | Borderou de evaluare (job #2145205) | Cod sursa (job #1967414)
#include <bits/stdc++.h>
#define NMAX 2005
#define KMAX 18
#define INF 0x3f3f3f3f
#define GET_SIZE(x) (((double)sizeof(x))/1024/1024)
using namespace std;
typedef pair<int,int> wow;
ifstream fin("ubuntzei.in");
ofstream fout("ubuntzei.out");
int n,k,m,t;
int costK[KMAX][KMAX];
int dist[NMAX];
vector<wow> g[NMAX];
int buddy[NMAX];
priority_queue<wow,vector<wow>,greater<wow> > pq;
int dp[(1<<KMAX)][KMAX];
void dijkstra(int s) {
pq.push({0,s});
fill(dist+0,dist+n+1,INF);
dist[s]=0;
for(;pq.size();pq.pop()) {
int currNode = pq.top().second;
int currDist = pq.top().first;
for(auto q:g[currNode]) {
int nextN = q.first;
int costM = q.second;
if(dist[nextN]>dist[currNode]+costM) {
dist[nextN]=dist[currNode]+costM;
pq.push({dist[nextN],nextN});
}
}
}
}
int main()
{
fin>>n>>m>>k;
memset(dp,INF,sizeof(dp));
buddy[0]=1;
for(int i=1;i<=k;i++) {
fin>>buddy[i];
}
buddy[++k]=n;
for(int i=1;i<=m;i++) {
int x,y,z;
fin>>x>>y>>z;
g[x].push_back({y,z});
g[y].push_back({x,z});
}
for(int i=0;i<=k;i++) {
dijkstra(buddy[i]);
for(int j=0;j<=k;j++) {
costK[i][j]=dist[buddy[j]];
}
costK[i][i]=0;
}
dp[1][0]=0;
int stareFinala=(1<<(k+1))-1;
for(int stare=1;stare<=stareFinala;stare++) {
for(int i=0;i<=k;i++) {
if((stare&(1<<i))==0) continue;
for(int j=0;j<=k;j++) {
if(i==j) continue;
if(stare&(1<<j)) continue;
dp[stare|(1<<j)][j]=min(dp[stare|(1<<j)][j],dp[stare][i]+costK[i][j]);
}
}
}
fout<<dp[stareFinala][k];
return 0;
}