Cod sursa(job #2538815)

Utilizator rd211Dinucu David rd211 Data 5 februarie 2020 10:23:48
Problema Gather Scor 10
Compilator cpp-64 Status done
Runda simulare_miri Marime 1.65 kb
#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)
{
    if(nodes[node] && used==k-1) res = min(res, dp[node][used]);
    for(coridor cor: graf[node])
    {
        if(cor.capacitate>=used)
        {
            if(nodes[node] && cor.capacitate>used)
            {
                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 = 0; i<=n; i++)
        fill(dp[i],dp[i]+NMAX,INT_MAX);
    dp[1][0] = 0;
    calc(1,0);
    fout<<res;
    return 0;
}