Pagini recente » Cod sursa (job #1631294) | Cod sursa (job #3234664) | Cod sursa (job #2519947) | Cod sursa (job #2881467) | Cod sursa (job #2548104)
#include <bits/stdc++.h>
using namespace std;
ifstream fin("gather.in");
ofstream fout("gather.out");
struct edge{
unsigned int dest, cost, d;
};
struct node{
vector<edge> vec;
};
vector<node> g;
struct lols{
unsigned int poz, c;
};
bool operator<(lols a, lols b){
return a.c>b.c;
}
void dijkstra(unsigned int s, unsigned int d, unsigned int n, vector<unsigned int> &sol){
d--;
priority_queue<lols> q;
q.push({s, 1});
while(!q.empty()){
auto x=q.top();
while(!q.empty()&&sol[q.top().poz]) q.pop(), x=q.top();
if(!q.empty()){
lols x=q.top();
q.pop();
unsigned int nod=x.poz;
unsigned int cost=x.c;
sol[nod]=cost;
for(auto i:g[nod].vec){
if(i.d>=d){
q.push({i.dest, cost+i.cost});
}
}
}
}
for(unsigned int i=1;i<=n;++i) sol[i]--;
}
unsigned int dp[17][(1<<16)+1];
unsigned int dist[16][16][16];
int main(){
unsigned int n, m, k;
fin>>k>>n>>m;
g.resize(n+1);
k++;
vector<unsigned int> v(k+1);
v[1]=1;
for(unsigned int i=2;i<=k;++i){
fin>>v[i];
}
for(unsigned int i=1;i<=m;++i){
unsigned int a, b, c, d;
fin>>a>>b>>c>>d;
g[a].vec.push_back({b, c, d});
g[b].vec.push_back({a, c, d});
}
for(unsigned int i=1;i<=k;++i){
for(unsigned int j=1;j<=k;++j){
vector<unsigned int> sol(n+1);
dijkstra(v[i], j, n, sol);
for(unsigned int p=1;p<=k;++p){
dist[i][p][j]=sol[v[p]];
}
}
}
unsigned int mask=1<<k;
for(unsigned int i=1;i<=k;++i){
for(unsigned int j=1;j<mask;++j){
dp[i][j]=((1LL<<31));
}
}
dp[1][1]=0;
for(unsigned int i=1;i<mask;i=(i+1)|1){
for(unsigned int poz=1;poz<=k;++poz){
if(!(i&(1<<(poz-1)))) continue;
vector<unsigned int> nobit;
unsigned int cnt=0;
for(unsigned int j=0;j<k;++j){
if(i&(1<<j)) cnt++;
else{
nobit.push_back(j);
}
}
for(auto j:nobit){
if(dist[poz][j+1][cnt]>0){
dp[j+1][i|(1<<j)]=min(dp[j+1][i|(1<<j)], dp[poz][i]+dist[poz][j+1][cnt]*cnt);
}
}
}
}
unsigned int sol=(1LL<<32)-1;
for(unsigned int i=1;i<=k;++i){
sol=min(sol, dp[i][mask-1]);
}
fout<<sol<<"\n";
return 0;
}