Pagini recente » Cod sursa (job #1455899) | Cod sursa (job #883731) | Cod sursa (job #1920429) | Cod sursa (job #1653629) | Cod sursa (job #2379262)
#include <iostream>
#include <fstream>
#include <vector>
#include <queue>
#define f first
#define s second
using namespace std;
ifstream fin("gather.in");
ofstream fout("gather.out");
long long dist[20][20][20],fv[760],g[20],M,N,K,viz[760],d[65600][20],aux,nr[65600];
vector <pair<long long,pair<long long,long long> > > v[760];
priority_queue <pair<long long,long long>,vector<pair<long long,long long> >, greater<pair<long long,long long> > > q;
pair <long long,long long> p;
int main()
{
long long i,j,k,a,b,c,z,nod,pinf,minn;
pinf=(long long)(1<<26)*(1<<26);
fin>>K>>N>>M;
g[0]=1;
for(i=1; i<=K; i++)
{
fin>>g[i];
fv[g[i]]=i;
}
for(i=1; i<=M; i++)
{
fin>>a>>b>>c>>z;
v[a].push_back(make_pair(c,make_pair(b,z)));
v[b].push_back(make_pair(c,make_pair(a,z)));
}
for(i=0; i<=K; i++)
{
for(j=0; j<=K; j++)
{
for(k=1;k<=K;k++)
dist[j][k][i]=pinf;
nod=g[j];
for(auto it: v[nod])
{
if(i<=it.s.s)
q.push(make_pair(it.f,it.s.f));
}
while(!q.empty())
{
p=q.top();
q.pop();
if(viz[p.s]==0)
{
viz[p.s]=1;
if(fv[p.s]!=0)
{
dist[j][fv[p.s]][i]=p.f;
}
for(auto it:v[p.s])
{
if(viz[it.s.f]==0&&i<=it.s.s)
q.push(make_pair(p.f+it.f,it.s.f));
}
}
}
for(k=1;k<=N;k++)
viz[k]=0;
}
}
for(i=3;i<=(1<<(K+1))-1;i=i+2)
{
for(j=1;j<=K;j++)
{
d[i][j]=pinf;
if((i&(1<<j))==(1<<j))
{
aux=i-(1<<j);
if(aux==1)
{
d[i][j]=dist[0][j][0];
nr[i]=1;
}
else
{
for(k=1;k<=K;k++)
{
if((aux&(1<<k))==(1<<k))
{
d[i][j]=min(d[i][j],d[aux][k]+dist[k][j][nr[aux]]*(nr[aux]+1));
nr[i]=nr[aux]+1;
}
}
}
if(d[i][j]>pinf)
d[i][j]=pinf;
}
}
}
minn=pinf;
i=(1<<(K+1))-1;
for(j=1;j<=K;j++)
{
minn=min(minn,d[i][j]);
}
fout<<minn;
}