Cod sursa(job #2538784)

Utilizator rd211Dinucu David rd211 Data 5 februarie 2020 09:30:07
Problema Gather Scor 10
Compilator cpp-64 Status done
Runda simulare_miri Marime 1.55 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)
{
    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;
}