Cod sursa(job #1611969)

Utilizator AeroHHorea Stefan AeroH Data 24 februarie 2016 16:57:04
Problema Ubuntzei Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.86 kb
#include <fstream>
#include <vector>
#include <queue>
#include <cstring>///Doar memset
#define oo 20000000
using namespace std;
string z = "ubuntzei.";

ifstream f(z+"in");
ofstream g(z+"out");

vector< pair<int,int> > v[2001];
vector<int> u;
int n,m,k,x,y,p,i,aux,c[20][20],r,pos[2001],d[1<<17][17],rasp=oo;

void dist(int nod)
{
    aux=nod;
    queue<int> q;
    int d[2001];
    for (int i=0;i<2001;++i)d[i]=oo;
    q.push(nod);
    d[nod]=0;
    while(q.size())
    {
        nod=q.front();
        q.pop();
        for (int i=0;i<v[nod].size();++i)
            if (d[v[nod][i].first] > (d[nod]+v[nod][i].second))
                {
                    d[v[nod][i].first] = d[nod]+v[nod][i].second;
                    q.push(v[nod][i].first);
                }
    }
    for (int i=0;i<u.size();++i)
        if (aux==u[i])c[pos[aux]][pos[aux]]=oo;
        else c[pos[aux]][pos[u[i]]]=d[u[i]];
}

int solve(int mask,int nod)
{
   if (d[mask][nod]==-1)
   {
        d[mask][nod]=oo;
        for (int i=0;i<n;++i)
        {
            if ((i == 0 && mask!=(1<<nod)+1 )||( i == nod))continue;
            if (mask&(1<<i))
            {
                d[mask][nod]=min(d[mask][nod],solve(mask^(1<<nod),i)+c[i][nod]);
            }
        }
   }
   return d[mask][nod];
}

int main()
{
    f>>n>>m>>k;
    u.push_back(1);pos[1]=0;
    for (i=1;i<=k;++i)
        f>>x,u.push_back(x),pos[x]=i;
    u.push_back(n),pos[n]=u.size()-1;
    while(m--)
    {
        f>>x>>y>>p;
        v[y].push_back({x,p});
        v[x].push_back({y,p});
    }
    for(i=0;i<u.size();++i)
        dist(u[i]);
    for (i=0;i<=n;++i)
        v[i].resize(0);
    n=u.size()-1;
    memset(d,-1,sizeof(d));
    d[1][0]=0;
    for (i=0;i<u.size()-1;++i)
    {
        rasp=min(rasp,solve((1<<n)-1,i)+c[i][n]);
    }
    g<<rasp;

    return 0;
}