Cod sursa(job #1223372)

Utilizator Vally77FMI Calinescu Valentin Gelu Vally77 Data 28 august 2014 01:44:44
Problema Ubuntzei Scor 70
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.31 kb
#include <iostream>
#include <fstream>
#include <vector>
#include <queue>
using namespace std;
ifstream ka("ubuntzei.in");
ofstream ki("ubuntzei.out");
const int N_MAX = 2000;
const int K_MAX = 15;
int n, m, k, opriri[K_MAX + 3];
int distante[K_MAX + 3][K_MAX + 3], sume[K_MAX+1][1 << (K_MAX+1)];
int dijdist[N_MAX + 1];

struct varf
{
    int index;
    int cost;
    bool operator < (const varf arg) const
    {
        return arg.cost > cost;
    }
};

vector <vector <varf> >dij(N_MAX + 1);

priority_queue <varf> coada;

int suma(int numar_nr, int configuratie, int terminatie)
{
    if(numar_nr == 1)
        return distante[1][terminatie+2];
    if(!sume[terminatie][configuratie])
    {
        int s = 0x7fffffff;
            for(int j = 0; j < (k+1); j++)
                if((configuratie - (1<< terminatie)) &  (1 << j))
                    s = min(s, suma(numar_nr - 1, configuratie - (1 << terminatie), j) + distante[terminatie+2][j+2]);
        sume[terminatie][configuratie] = s;
    }
    return sume[terminatie][configuratie];
}

void dijkstra(int t)
{
    varf v;
    v.index = t;
    v.cost = 0;
    coada.push(v);
    while(!coada.empty())
    {
        varf vv = coada.top();
        coada.pop();
        for(int i = 0; i < dij[vv.index].size(); i++)
        {
            if(vv.cost + dij[vv.index][i].cost < dijdist[dij[vv.index][i].index])
            {
                dijdist[dij[vv.index][i].index] = vv.cost + dij[vv.index][i].cost;
                varf f;
                f.index = dij[vv.index][i].index;
                f.cost = vv.cost + dij[vv.index][i].cost;
                coada.push(f);
            }
        }
    }
}

int main()
{
    ka >> n >> m >> k;
    opriri[++opriri[0]] = 1;
    for(int i = 1; i <= k; i++)
        ka >> opriri[++opriri[0]];
    opriri[++opriri[0]] = n;
    int x, y, z;
    for(int i = 1; i <= m; i++)
    {
        ka >> x >> y >> z;
        varf v;
        v.index = y;
        v.cost = z;
        dij[x].push_back(v);
        v.index = x;
        dij[y].push_back(v);
    }
    for(int i = 1; i <= opriri[0]; i++)
    {
        for(int j = 1; j <= n; j++)
            dijdist[j] = 0x7fffffff;
        dijdist[opriri[i]] = 0;
        dijkstra(opriri[i]);
        for(int j = 1; j <= opriri[0]; j++)
            distante[i][j] = dijdist[opriri[j]];
    }
    ki << suma(k+1, (1 << (k+1)) -1, k);
}