Pagini recente » Cod sursa (job #2815586) | Cod sursa (job #2518176) | Cod sursa (job #605022) | Cod sursa (job #3243748) | Cod sursa (job #1899977)
#include <bits/stdc++.h>
#define Nmax 755
#define pb push_back
using namespace std;
int k,n,m,wh[Nmax],dp[Nmax][(1<<15)],nrb[(1<<15)];
struct edge
{
int nod,dist,cap;
bool operator <(const edge &A) const
{
return dist>A.dist;
}
};
vector <edge> L[Nmax];
priority_queue <edge> Q;
inline void Dijkstra()
{
int i,j;
edge w,w1;
for(i=1;i<=n;++i)
for(j=0;j<(1<<k);++j) dp[i][j]=-1;
if(wh[1])
{
dp[1][(1<<(wh[1]-1))]=0;
w.nod=1; w.dist=0; w.cap=(1<<(wh[1]-1)); Q.push(w);
}
else
{
dp[1][0]=0;
w.nod=1; w.dist=0; w.cap=0; Q.push(w);
}
while(!Q.empty())
{
w=Q.top(); Q.pop();
for(auto it : L[w.nod])
{
if(nrb[w.cap]>it.cap) continue;
w1.nod=it.nod;
w1.cap=w.cap;
if(wh[w1.nod]) w1.cap|=(1<<(wh[w1.nod]-1));
w1.dist=w.dist+it.dist*(nrb[w.cap]+1);
if(dp[w1.nod][w1.cap]==-1 || dp[w1.nod][w1.cap] > w1.dist)
{
dp[w1.nod][w1.cap]=w1.dist;
Q.push(w1);
}
}
}
}
inline int nr_bits(int x)
{
int sol=0;
for(;x;x=(x&(x-1)),++sol);
return sol;
}
int main()
{
int i,x,y;
edge w;
ifstream cin("gather.in");
ofstream cout("gather.out");
cin>>k>>n>>m;
for(i=1;i<=k;++i)
{
cin>>x; wh[x]=i;
}
while(m--)
{
cin>>x>>y>>w.dist>>w.cap;
w.nod=y; L[x].pb(w);
w.nod=x; L[y].pb(w);
}
for(i=0;i<(1<<k);++i) nrb[i]=nr_bits(i);
Dijkstra();
int sol=-1;
for(i=1;i<=n;++i)
{
if(dp[i][(1<<k)-1]==-1) continue;
if(sol==-1 || sol>dp[i][(1<<k)-1]) sol=dp[i][(1<<k)-1];
}
cout<<sol<<"\n";
return 0;
}