Cod sursa(job #1240642)

Utilizator ArchazeyBaltatu Andrei-Mircea Archazey Data 11 octombrie 2014 20:12:25
Problema Gather Scor 90
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.72 kb
#include<bits/stdc++.h>
using namespace std;

struct cell
{
    int nod;
    int cost,limit;
    bool operator <(const cell &e) const
        {
            return cost>e.cost;
        }
};

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

const int CFMAX=1<<15;
const int oo=1<<30;
const int KMAX=20;
const int NMAX=755;

int k,n,m,detinuti[NMAX],c[NMAX];
int dp[KMAX][KMAX][KMAX],stare[CFMAX][KMAX];
vector<cell>v[NMAX];
vector<cell>::iterator it;
priority_queue<cell>Q;


inline void DIJKSTRA(int x,int y,int z)
{
    int i;
    cell p,pp;
    p.nod=y;
    p.cost=0;c[y]=0;
    Q.push(p);
    while (!Q.empty())
        {
            p=Q.top();
            Q.pop();
            if (p.cost==c[p.nod])
                {
                    for (it=v[p.nod].begin();it!=v[p.nod].end();it++)
                        if ((*it).limit>=z && c[(*it).nod]>p.cost+(*it).cost*(z+1))
                            {
                                c[(*it).nod]=p.cost+(*it).cost*(z+1);
                                pp.cost=c[(*it).nod];
                                pp.nod=(*it).nod;
                                Q.push(pp);
                            }
                }
        }
    for (i=0;i<k;i++) dp[x][i][z]=c[detinuti[i]];
}

inline int NUMARA(int conf)
{
    if (conf==0) return 0;
    else return 1+NUMARA(conf-(conf^(conf&(conf-1))));
}

int main()
{
    int i,j,l,x,y,w,z,conf,aux,nrbiti;
    int minimal;
    cell p;
    fin>>k>>n>>m;
    for (i=0;i<k;i++) fin>>detinuti[i];
    for (i=1;i<=m;i++)
        {
            fin>>x>>y>>w>>z;
            p.nod=y;
            p.cost=w;
            p.limit=z;
            v[x].push_back(p);
            p.nod=x;
            v[y].push_back(p);
        }
    for (l=1;l<NMAX;l++) c[l]=oo;
    DIJKSTRA(0,1,0);
    for (i=0;i<k;i++)
        for (j=1;j<=k;j++)
            {
                for (l=1;l<NMAX;l++) c[l]=oo;
                DIJKSTRA(i+1,detinuti[i],j);
            }

    //initializare
    for (conf=1;conf<(1<<k);conf++)
        for (i=0;i<k;i++)
            stare[conf][i]=oo;

    for (i=0;i<k;i++) stare[1<<i][i]=dp[0][i][0];
    for (conf=1;conf<(1<<k);conf++)
        for (i=0;i<k;i++)
            if (conf&(1<<i))
                {
                    aux=conf-(1<<i);
                    nrbiti=NUMARA(aux);
                    //fout<<conf<<" "<<aux<<" "<<nrbiti<<"\n";
                    for (j=0;j<k;j++)
                        if (aux&(1<<j))
                            stare[conf][i]=min(stare[conf][i],stare[aux][j]+dp[j+1][i][nrbiti]);
                }
    minimal=oo;
    for (i=0;i<k;i++)
        minimal=min(minimal,stare[(1<<k)-1][i]);
    fout<<minimal<<"\n";
    return 0;
}