Cod sursa(job #2379262)

Utilizator vladsirbu23Vlad Sirbu vladsirbu23 Data 13 martie 2019 11:19:46
Problema Gather Scor 90
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.7 kb
#include <iostream>
#include <fstream>
#include <vector>
#include <queue>
#define f first
#define s second
using namespace std;
ifstream fin("gather.in");
ofstream fout("gather.out");
long long dist[20][20][20],fv[760],g[20],M,N,K,viz[760],d[65600][20],aux,nr[65600];
vector <pair<long long,pair<long long,long long> > > v[760];
priority_queue <pair<long long,long long>,vector<pair<long long,long long> >, greater<pair<long long,long long> > > q;
pair <long long,long long> p;
int main()
{
    long long i,j,k,a,b,c,z,nod,pinf,minn;
    pinf=(long long)(1<<26)*(1<<26);
    fin>>K>>N>>M;
    g[0]=1;
    for(i=1; i<=K; i++)
    {
        fin>>g[i];
        fv[g[i]]=i;
    }
    for(i=1; i<=M; i++)
    {
        fin>>a>>b>>c>>z;
        v[a].push_back(make_pair(c,make_pair(b,z)));
        v[b].push_back(make_pair(c,make_pair(a,z)));
    }
    for(i=0; i<=K; i++)
    {
        for(j=0; j<=K; j++)
        {
            for(k=1;k<=K;k++)
                dist[j][k][i]=pinf;
            nod=g[j];
            for(auto it: v[nod])
            {
                if(i<=it.s.s)
                    q.push(make_pair(it.f,it.s.f));
            }
            while(!q.empty())
            {
                p=q.top();
                q.pop();
                if(viz[p.s]==0)
                {
                    viz[p.s]=1;
                    if(fv[p.s]!=0)
                    {
                        dist[j][fv[p.s]][i]=p.f;
                    }
                    for(auto it:v[p.s])
                    {
                        if(viz[it.s.f]==0&&i<=it.s.s)
                            q.push(make_pair(p.f+it.f,it.s.f));
                    }
                }
            }
            for(k=1;k<=N;k++)
                viz[k]=0;
        }
    }
    for(i=3;i<=(1<<(K+1))-1;i=i+2)
    {
        for(j=1;j<=K;j++)
        {
            d[i][j]=pinf;
            if((i&(1<<j))==(1<<j))
            {
                aux=i-(1<<j);
                if(aux==1)
                {
                    d[i][j]=dist[0][j][0];
                    nr[i]=1;
                }
                else
                {
                    for(k=1;k<=K;k++)
                    {
                        if((aux&(1<<k))==(1<<k))
                        {
                            d[i][j]=min(d[i][j],d[aux][k]+dist[k][j][nr[aux]]*(nr[aux]+1));
                            nr[i]=nr[aux]+1;
                        }
                    }
                }
                if(d[i][j]>pinf)
                    d[i][j]=pinf;
            }
        }
    }
    minn=pinf;
    i=(1<<(K+1))-1;
    for(j=1;j<=K;j++)
    {
        minn=min(minn,d[i][j]);
    }
    fout<<minn;
}