Cod sursa(job #2538893)

Utilizator NashikAndrei Feodorov Nashik Data 5 februarie 2020 12:15:55
Problema Gather Scor 20
Compilator cpp-64 Status done
Runda simulare_miri Marime 2.49 kb
//#include <iostream>
#include <vector>
#include <queue>
#include <fstream>
using namespace std;
int d[800][35000],put[20];
int graf[800];
ifstream cin("gather.in");
ofstream cout("gather.out");
struct edge{
    int a,b;
    int cap,dist;
}x,y;
priority_queue <pair<int,pair<int,pair<int,int> > > > q;
vector<edge> legit[800];
bool apare(int stare,int bit){
    if(bit==-1)
        return true;
    if(bit==0){
        if(stare%2==1){
            return true;
        }
        return false;
    }
    if((stare/put[bit]*put[bit])%put[bit+1]==0){
        return false;
    }
    return true;
}
int trans(int stare,int bit){
    stare+=put[bit];
    return stare;
}
int main()
{
    int k,n,m,a,b,dist,cap;
    cin>>k>>n>>m;
    for(int i=0;i<=760;i++)
        graf[i]=-1;
    for(int i=1;i<=k;i++){
        cin>>a;
        graf[a]=i-1;
    }
    for(int i=1;i<=m;i++){
        cin>>a>>b>>dist>>cap;
        x.a=a;
        x.b=b;
        x.dist=dist;
        x.cap=cap;

        y.a=b;
        y.b=a;
        y.dist=dist;
        y.cap=cap;
        legit[a].push_back(x);
        legit[b].push_back(y);
    }
    put[0]=1;
    for(int i=1;i<=16;i++){
        put[i]=put[i-1]*2;
    }
    q.push(make_pair(0,make_pair(1,make_pair(0,0))));
    while(q.empty()==false){
        int dist=q.top().first;
        int nod=q.top().second.first;
        int stare=q.top().second.second.first;
        int pers=q.top().second.second.second;
        q.pop();
        if(d[nod][stare]==1){
            continue;
        }
        d[nod][stare]=1;
        if(pers==k){
            cout<<-dist;
            return 0;
        }
        if(pers==k-1 and graf[nod]!=-1){
            if(apare(stare,graf[nod]==false)){
                cout<<-dist;
                return 0;
            }
        }
        if(graf[nod]!=-1){
            apare(stare,graf[nod]);
        }
        if(graf[nod]!=-1 and apare(stare,graf[nod])==false){
            int stt=trans(stare,graf[nod]);
            int pp=pers+1;
            for(int j=0;j<legit[nod].size();j++){
                if(legit[nod][j].cap>=pp){
                    q.push(make_pair(dist-legit[nod][j].dist*(pp+1),make_pair(legit[nod][j].b,make_pair(stt,pp))));
                }
            }
        }
        //cout<<"GIGEL2\n";
        for(int j=0;j<legit[nod].size();j++){
            if(legit[nod][j].cap>=pers){
                q.push(make_pair(dist-legit[nod][j].dist*(pers+1),make_pair(legit[nod][j].b,make_pair(stare,pers))));
            }
        }

    }

    return 0;
}
/**
buna casian patrascanu
*/