Cod sursa(job #2101176)

Utilizator Laura_CorneiLaura Maria Cornei Laura_Cornei Data 6 ianuarie 2018 22:58:57
Problema Ubuntzei Scor 80
Compilator cpp Status done
Runda long_challenge Marime 2.19 kb
#include <fstream>
#include <vector>
#define nmax 2005
#define kmax 18
#define inf 2000000000
using namespace std;
fstream f1("ubuntzei.in", ios::in);
fstream f2("ubuntzei.out", ios::out);
int nrconf, n, m, k, c[nmax], dist[kmax][kmax], prim, ultim, nrel, coada[nmax], viz[nmax], d[nmax], ctmin[nmax][65540];///2^kmax
vector <pair<int, int> > v[nmax];
void citire()
{
    int i, x, y, cc;
    f1>>n>>m>>k;
    for(i=1; i<=k; i++)
        f1>>c[i];
    c[0]=1; c[k+1]=n; k++;
    nrconf=(1<<(k+1))-1;
    for(i=1; i<=m; i++)
    {
        f1>>x>>y>>cc;
        v[x].push_back({y, cc});
        v[y].push_back({x, cc});
    }
}
void bellman(int ub,int iub)
{
    int i, nod, vec, cost;
    for(i=1; i<=n; i++)
        {
            d[i]=inf;
            viz[i]=0;
        }
    d[ub]=0;
    viz[ub]=1;
    prim=ultim=nrel=1;
    coada[ultim]=ub;

    while(nrel!=0)
    {
        nod=coada[prim];
        viz[nod]=0;
        prim++;
        nrel--;
        for(auto it=v[nod].begin(); it!=v[nod].end(); ++it)
        {
            vec=(*it).first;
            cost=(*it).second;
            if(d[vec]> d[nod]+cost)
            {
               d[vec]=d[nod]+cost;
               if(!viz[vec])
               {
                   viz[vec]=1;
                   ultim++;
                   nrel++;
                   coada[ultim]=vec;
               }
            }
        }
    }

    for(i=0; i<=k; i++)
        dist[iub][i]=dist[i][iub]=d[c[i]];
}
void distante()
{
    int i;
    for(i=0; i<=k; i++)
        bellman(c[i],i);
}
void din()
{
    int config, ub, ub2;
    for(ub=0; ub<=k; ub++)
       for(config=0; config<=nrconf; config++)
        ctmin[ub][config]=inf;

    ctmin[0][1]=0;
    for(config=0; config<=nrconf; config++)
        for(ub=0; ub<=k; ub++)
           if(((1<<ub) & config)!=0)
           {
              for(ub2=0; ub2<=k; ub2++)
                 if((ub!=ub2)&&(((1<<ub2)& config)!=0))
                    ctmin[ub][config]=min(ctmin[ub2][config^(1<<ub)]+ dist[ub][ub2],  ctmin[ub][config]);
           }
    f2<<ctmin[k][nrconf];
}
int main()
{
    citire();
    distante(); ///dintre ubunzt
    din();
    return 0;
}