Pagini recente » Cod sursa (job #151155) | Cod sursa (job #605357) | Cod sursa (job #696210) | Cod sursa (job #2419603) | Cod sursa (job #1240642)
#include<bits/stdc++.h>
using namespace std;
struct cell
{
int nod;
int cost,limit;
bool operator <(const cell &e) const
{
return cost>e.cost;
}
};
ifstream fin("gather.in");
ofstream fout("gather.out");
const int CFMAX=1<<15;
const int oo=1<<30;
const int KMAX=20;
const int NMAX=755;
int k,n,m,detinuti[NMAX],c[NMAX];
int dp[KMAX][KMAX][KMAX],stare[CFMAX][KMAX];
vector<cell>v[NMAX];
vector<cell>::iterator it;
priority_queue<cell>Q;
inline void DIJKSTRA(int x,int y,int z)
{
int i;
cell p,pp;
p.nod=y;
p.cost=0;c[y]=0;
Q.push(p);
while (!Q.empty())
{
p=Q.top();
Q.pop();
if (p.cost==c[p.nod])
{
for (it=v[p.nod].begin();it!=v[p.nod].end();it++)
if ((*it).limit>=z && c[(*it).nod]>p.cost+(*it).cost*(z+1))
{
c[(*it).nod]=p.cost+(*it).cost*(z+1);
pp.cost=c[(*it).nod];
pp.nod=(*it).nod;
Q.push(pp);
}
}
}
for (i=0;i<k;i++) dp[x][i][z]=c[detinuti[i]];
}
inline int NUMARA(int conf)
{
if (conf==0) return 0;
else return 1+NUMARA(conf-(conf^(conf&(conf-1))));
}
int main()
{
int i,j,l,x,y,w,z,conf,aux,nrbiti;
int minimal;
cell p;
fin>>k>>n>>m;
for (i=0;i<k;i++) fin>>detinuti[i];
for (i=1;i<=m;i++)
{
fin>>x>>y>>w>>z;
p.nod=y;
p.cost=w;
p.limit=z;
v[x].push_back(p);
p.nod=x;
v[y].push_back(p);
}
for (l=1;l<NMAX;l++) c[l]=oo;
DIJKSTRA(0,1,0);
for (i=0;i<k;i++)
for (j=1;j<=k;j++)
{
for (l=1;l<NMAX;l++) c[l]=oo;
DIJKSTRA(i+1,detinuti[i],j);
}
//initializare
for (conf=1;conf<(1<<k);conf++)
for (i=0;i<k;i++)
stare[conf][i]=oo;
for (i=0;i<k;i++) stare[1<<i][i]=dp[0][i][0];
for (conf=1;conf<(1<<k);conf++)
for (i=0;i<k;i++)
if (conf&(1<<i))
{
aux=conf-(1<<i);
nrbiti=NUMARA(aux);
//fout<<conf<<" "<<aux<<" "<<nrbiti<<"\n";
for (j=0;j<k;j++)
if (aux&(1<<j))
stare[conf][i]=min(stare[conf][i],stare[aux][j]+dp[j+1][i][nrbiti]);
}
minimal=oo;
for (i=0;i<k;i++)
minimal=min(minimal,stare[(1<<k)-1][i]);
fout<<minimal<<"\n";
return 0;
}