Cod sursa(job #877016)

Utilizator SpiriFlaviuBerbecariu Flaviu SpiriFlaviu Data 12 februarie 2013 14:47:44
Problema Ubuntzei Scor 45
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.59 kb
#include <fstream>
#include <vector>
#include <algorithm>
#include <queue>
#define INF 999999999

using namespace std;

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

vector<pair<int,int> > v[2001];
int drum[17][2001];
queue<int> q;
int n,m,k,C[16],solmin=INF;
int used[16];
//ovarflau

void back(int last, int deep,int sol)
{
    if(deep==k)
    {
        if(sol + drum[last][n]<solmin)
            solmin = sol + drum[last][n];

        return;
    }
    for(int i=1;i<=k;i++)
        if(!used[i])
        {
            used[i] = true;
            back(i,deep+1,sol + drum[last][C[i]]);
            used[i] = false;
        }
}


int main()
{
    fin>>n>>m>>k;
    for(int i=1;i<=k;i++)
        fin>>C[i];
    int x,co,y;
    for(int i=1;i<=m;i++)
    {
        fin>>x>>y>>co;
        v[x].push_back(make_pair(y,co));
        v[y].push_back(make_pair(x,co));
    }
    for(int i=0;i<=k;i++)
        for(int j=1;j<=n;j++)
            drum[i][j] = INF;
    C[0] = 1;
    for(int p = 0; p <= k; p++)
    {
        q.push(C[p]);
        drum[p][C[p]] = 0;
        while(!q.empty())
        {
            int nod = q.front();
            for(unsigned int i=0;i<v[nod].size();i++)
                if(drum[p][nod] + v[nod][i].second < drum[p][v[nod][i].first])
                {
                    q.push(v[nod][i].first);
                    drum[p][v[nod][i].first] = drum[p][nod] + v[nod][i].second;
                }
            q.pop();
        }
    }
    back(0,0,0);
    fout<<solmin;

    fin.close();
    fout.close();
    return 0;
}