Pagini recente » Cod sursa (job #1005783) | Cod sursa (job #1326544) | Cod sursa (job #3345645) | Cod sursa (job #3343833) | Cod sursa (job #3305085)
#include<bits/stdc++.h>
using namespace std;
ifstream fin("gather.in");
ofstream fout("gather.out");
unsigned int n,m,k, det[17], precalc[17][17], mx_det[17][17], dist[755], detinuti[755];
pair<unsigned int,unsigned int> dp[1<<16][17];
vector<tuple<int,int,int>> v[755];
void precalc_dijkstra(int x){
priority_queue<tuple<unsigned int,unsigned int,unsigned int>> q;
for(int i=1; i<=n;i++)
dist[i]=1e9;
q.push({0,det[x], 1e9});
dist[det[x]]=0;
while(!q.empty()){
unsigned int dis, nod, md;
tie(dis,nod,md)=q.top();
q.pop();
dis=-dis;
if(dis>dist[nod]) continue;
for(auto vec: v[nod]){
unsigned int neigh, cost, mxd;
tie(neigh, cost, mxd)=vec;
if(dist[neigh]>=dist[nod]+cost){
dist[neigh]=dist[nod]+cost;
mxd=min(md, mxd);
detinuti[neigh]=mxd;
q.push({-dist[neigh], neigh, mxd});
}
}
}
for(int i=x+1; i<=k; i++){
precalc[x][i]=precalc[i][x]=dist[det[i]];
mx_det[x][i]=mx_det[i][x]=detinuti[det[i]];
}
}
int main()
{
fin>>k>>n>>m;
k++;
det[1]=1;
for(int i=2; i<=k; i++) fin>>det[i];
while(m--){
int x,y,z,w;
fin>>x>>y>>z>>w;
v[x].push_back({y,z,w});
v[y].push_back({x,z,w});
}
for(int i=1; i<k;i++)
precalc_dijkstra(i);
for(int i=0; i<(1<<k); i++)
for(int j=0; j<=k; j++)
dp[i][j]={1e9,1e9};
dp[1][1]={0, 1e9};
for(int mask=3; mask<(1<<k); mask++){
int nob=__builtin_popcount(mask)-1; //fara i
if(nob<0) continue;
for(int i=0; i<k; i++)
if(mask&(1<<i))
for(int j=0; j<k;j++)
if(mask&(1<<j) && i!=j){
if(dp[mask][i+1].first>dp[mask^(1<<i)][j+1].first+precalc[i+1][j+1]* nob && nob-1<=mx_det[i+1][j+1]){
dp[mask][i+1]={dp[mask^(1<<i)][j+1].first+precalc[i+1][j+1]*nob, min(mx_det[i+1][j+1], dp[mask^(1<<i)][j+1].second)};
}
}
}
unsigned int ans=1e9;
for(int i=2; i<=k; i++)
ans=min(ans, dp[(1<<k)-1][i].first);
fout<<ans;
return 0;
}