Cod sursa(job #1129401)

Utilizator SilviussMezei Silviu Silviuss Data 27 februarie 2014 22:00:29
Problema Ubuntzei Scor 50
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.62 kb
#include <fstream>
#include <vector>
#include <queue>

using namespace std;

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

int n,m,k,i,j,x,kk[17],t[2001],s=1000000000,ka[17][17],c[17];

void bk(int a,int z,int h)
{
    if(h==k)
    {
        if(z+ka[a][k+1]<s)
            s=z+ka[a][k+1];
    }
    else
    {
        if(z<s)
        {
            for(short w=0;w<=k;++w)
            {
                if(c[w]==0)
                {
                    c[w]=1;
                    bk(w,z+ka[a][w],h+1);
                    c[w]=0;
                }
            }
        }
    }
}

int main()
{
    vector<short> v[2001];
    vector<int> u[2001];
    queue<short> q;
    fin>>n>>m>>k;
    kk[0]=1;
    kk[k+1]=n;
    for(i=1;i<=k;++i)
    {
        fin>>j;
        kk[i]=j;
    }
    while(m)
    {
        fin>>i>>j>>x;
        v[i].push_back(j);
        u[i].push_back(x);
        v[j].push_back(i);
        u[j].push_back(x);
        m--;
    }
    for(i=0;i<=k+1;++i)
    {
        for(j=1;j<=n;++j)
            t[j]=1000000000;
        t[kk[i]]=0;
        for(q.push(kk[i]);q.size();q.pop())
        {
            x=q.front();
            for(j=0;j<v[x].size();++j)
                if(t[v[x][j]]>u[x][j]+t[x])
                {
                    t[v[x][j]]=u[x][j]+t[x];
                    q.push(v[x][j]);
                }
        }
        for(j=0;j<=k+1;++j)
            ka[i][j]=t[kk[j]];
    }
    /*for(i=0;i<=k+1;++i){
        for(j=0;j<=k+1;++j)
            cout<<ka[i][j]<<" ";
            cout<<"\n";}*/
    c[0]=1;
    bk(0,0,0);
    fout<<s;
}