Pagini recente » Cod sursa (job #1668481) | Cod sursa (job #1164057) | Cod sursa (job #153872) | Cod sursa (job #2432058) | Cod sursa (job #2924721)
#include <iostream>
#include <fstream>
#include <algorithm>
#include <queue>
#include <vector>
using namespace std;
ifstream fin ("gather.in");
ofstream fout ("gather.out");
const int NMAX=755;
const int NMAX1=20;
const int INF=2e9;
long long dist[NMAX1][NMAX];
bool det[NMAX];
struct elem{
int d;
int x;
long long l;
};
queue<elem>q;
vector<elem>v[NMAX];
void dijkstra(int p)
{
int nrd=0,kon=0;
long long lung;
dist[p][p]=0;
q.push({p,p,0});
while(!q.empty())
{
p=q.front().x;
nrd=q.front().d;
lung=q.front().l;
for(auto i:v[p])
{
kon=0;
if(det[i.x])
kon++;
if(i.l*(kon+nrd)+lung<dist[kon+nrd][i.x])
{
dist[kon+nrd][i.x]=i.l*(kon+nrd)+lung;
q.push({kon+nrd,i.x,i.l*(kon+nrd)+lung});
}
}
q.pop();
}
}
int main()
{
int n,m,i,k,x,a,b,c,d,j;
long long minim=INF;
fin>>k>>n>>m;
for(i=1;i<=k;i++)
{
fin>>x;
det[x]=true;
}
for(i=1;i<=m;i++)
{
fin>>a>>b>>c>>d;
v[a].push_back({d,b,c});
v[b].push_back({d,a,c});
}
for(i=1;i<=k;i++)
for(j=1;j<=n;j++)
dist[i][j]=INF;
dijkstra(1);
for(i=1;i<=n;i++)
minim=min(minim,dist[k][i]);
fout<<minim;
return 0;
}