Pagini recente » Cod sursa (job #2732803) | Cod sursa (job #2413966) | Cod sursa (job #810427) | Cod sursa (job #551723) | Cod sursa (job #2538784)
#include <bits/stdc++.h>
using namespace std;
ifstream fin("gather.in");
ofstream fout("gather.out");
const int NMAX = 760;
struct coridor
{
int ending;
int lungime, capacitate;
};
vector<coridor> graf[NMAX];
bool nodes[NMAX];
int k, n, m;
int dp[NMAX][NMAX]; //[coridor][merge cu ei]
int res = INT_MAX;
void calc(int node, int used)
{
for(coridor cor: graf[node])
{
if(cor.capacitate>=used)
{
if(nodes[node])
{
nodes[node] = false;
if(dp[cor.ending][used+1]>dp[node][used]+cor.lungime*(used+2))
{
dp[cor.ending][used+1] = dp[node][used]+cor.lungime*(used+2);
if(used+1==k) res = min(res, dp[node][used]);
calc(cor.ending, used+1);
}
nodes[node] = true;
}
if(dp[cor.ending][used]>dp[node][used]+cor.lungime*(used+1))
{
dp[cor.ending][used] = dp[node][used]+cor.lungime*(used+1);
calc(cor.ending, used);
}
}
}
}
int main()
{
fin>>k>>n>>m;
for(int i = 0; i<k; i++)
{
int x;
fin>>x;
nodes[x]=true;
}
for(int i = 0; i<m; i++)
{
int a, b, c, d;
fin>>a>>b>>c>>d;
graf[a].push_back({b,c,d});
graf[b].push_back({a,c,d});
}
for(int i = 1; i<=n; i++)
fill(dp[i],dp[i]+NMAX,INT_MAX);
dp[1][0] = 0;
calc(1,0);
fout<<res;
return 0;
}