Cod sursa(job #1899977)

Utilizator catalinrebegeaUNIBUC-Claudia Catarig catalinrebegea Data 3 martie 2017 08:03:28
Problema Gather Scor 60
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.83 kb
#include <bits/stdc++.h>
#define Nmax 755
#define pb push_back

using namespace std;

int k,n,m,wh[Nmax],dp[Nmax][(1<<15)],nrb[(1<<15)];

struct edge
{
    int nod,dist,cap;
    bool operator <(const edge &A) const
    {
        return dist>A.dist;
    }
};
vector <edge> L[Nmax];
priority_queue <edge> Q;

inline void Dijkstra()
{
    int i,j;
    edge w,w1;
    for(i=1;i<=n;++i)
        for(j=0;j<(1<<k);++j) dp[i][j]=-1;

    if(wh[1])
    {
        dp[1][(1<<(wh[1]-1))]=0;
        w.nod=1; w.dist=0; w.cap=(1<<(wh[1]-1)); Q.push(w);
    }
    else
    {
        dp[1][0]=0;
        w.nod=1; w.dist=0; w.cap=0; Q.push(w);
    }

    while(!Q.empty())
    {
        w=Q.top(); Q.pop();
        for(auto it : L[w.nod])
        {
            if(nrb[w.cap]>it.cap) continue;
            w1.nod=it.nod;
            w1.cap=w.cap;
            if(wh[w1.nod]) w1.cap|=(1<<(wh[w1.nod]-1));
            w1.dist=w.dist+it.dist*(nrb[w.cap]+1);
            if(dp[w1.nod][w1.cap]==-1 || dp[w1.nod][w1.cap] > w1.dist)
            {
                dp[w1.nod][w1.cap]=w1.dist;
                Q.push(w1);
            }
        }
    }
}

inline int nr_bits(int x)
{
    int sol=0;
    for(;x;x=(x&(x-1)),++sol);
    return sol;
}

int main()
{
    int i,x,y;
    edge w;
    ifstream cin("gather.in");
    ofstream cout("gather.out");
    cin>>k>>n>>m;
    for(i=1;i<=k;++i)
    {
        cin>>x; wh[x]=i;
    }
    while(m--)
    {
        cin>>x>>y>>w.dist>>w.cap;
        w.nod=y; L[x].pb(w);
        w.nod=x; L[y].pb(w);
    }

    for(i=0;i<(1<<k);++i) nrb[i]=nr_bits(i);

    Dijkstra();

    int sol=-1;
    for(i=1;i<=n;++i)
    {
        if(dp[i][(1<<k)-1]==-1) continue;
        if(sol==-1 || sol>dp[i][(1<<k)-1]) sol=dp[i][(1<<k)-1];
    }
    cout<<sol<<"\n";

    return 0;
}