Cod sursa(job #2924721)

Utilizator AndreiBOTOBotocan Andrei AndreiBOTO Data 9 octombrie 2022 13:29:26
Problema Gather Scor 10
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.42 kb
#include <iostream>
#include <fstream>
#include <algorithm>
#include <queue>
#include <vector>

using namespace std;

ifstream fin ("gather.in");
ofstream fout ("gather.out");

const int NMAX=755;
const int NMAX1=20;
const int INF=2e9;

long long dist[NMAX1][NMAX];
bool det[NMAX];

struct elem{
    int d;
    int x;
    long long l;
};

queue<elem>q;
vector<elem>v[NMAX];

void dijkstra(int p)
{
    int nrd=0,kon=0;
    long long lung;
    dist[p][p]=0;
    q.push({p,p,0});
    while(!q.empty())
    {
        p=q.front().x;
        nrd=q.front().d;
        lung=q.front().l;
        for(auto i:v[p])
        {
            kon=0;
            if(det[i.x])
                kon++;
            if(i.l*(kon+nrd)+lung<dist[kon+nrd][i.x])
            {
                dist[kon+nrd][i.x]=i.l*(kon+nrd)+lung;
                q.push({kon+nrd,i.x,i.l*(kon+nrd)+lung});
            }
        }
        q.pop();
    }
}

int main()
{
    int n,m,i,k,x,a,b,c,d,j;
    long long minim=INF;
    fin>>k>>n>>m;
    for(i=1;i<=k;i++)
    {
        fin>>x;
        det[x]=true;
    }
    for(i=1;i<=m;i++)
    {
        fin>>a>>b>>c>>d;
        v[a].push_back({d,b,c});
        v[b].push_back({d,a,c});
    }
    for(i=1;i<=k;i++)
        for(j=1;j<=n;j++)
            dist[i][j]=INF;
    dijkstra(1);
    for(i=1;i<=n;i++)
        minim=min(minim,dist[k][i]);
    fout<<minim;
    return 0;
}