Cod sursa(job #1550880)

Utilizator SpiriFlaviuBerbecariu Flaviu SpiriFlaviu Data 14 decembrie 2015 20:38:26
Problema Ubuntzei Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.96 kb
#include <iostream>
#include <fstream>
#include <vector>
#include <queue>
#include <algorithm>
using namespace std;

ifstream fin("ubuntzei.in");
ofstream fout("ubuntzei.out");
#define INF 0x3f3f3f3f
#define NMAX 2005

vector<pair<int, int> > v[NMAX];
bool used[NMAX];
int dp[16][(1<<16)];
int c[17];
int d[17][NMAX];

queue<int > Q;
int main()
{
    int n,m,k,x,y,cost;
    fin>>n>>m;
    fin>>k;
    k++;
    for(int i = 0; i < k; i++)
    {
        if(i < k-1)
            fin>>c[i];
        else c[i] = n;
        for(int j = 1; j <= n; j++)
            d[i][j] = INF;
    }
    for(int i = 1; i <= m; i++)
    {
        fin>>x>>y>>cost;
        v[x].push_back(make_pair(y,cost));
        v[y].push_back(make_pair(x,cost));
    }
    for(int ci = 0; ci < k; ci++)
    {
        Q.push(c[ci]);
        d[ci][c[ci]] = 0;
        while(!Q.empty())
        {
            x = Q.front();
            //int di = p.second;
            Q.pop();
            for(vector<pair<int, int> >::iterator it = v[x].begin(); it != v[x].end(); it++)
            {
                if(d[ci][x] + it->second < d[ci][it->first])
                {
                    d[ci][it->first] = d[ci][x] + it->second;
                    Q.push(it->first);
                }
            }
        }
    }

    for(int i = 0; i < k; i++)
    {
        for(int j = 1; j <= (1<<k); j++)
            dp[i][j] = INF;
    }
    for(int i = 0; i < k; i++)
    {
        dp[i][(1<<i)]=d[i][1];
    }
    for(int nr = 1; nr <= (1<<k); nr++)
    {

        for(int i = 0; i < k; i++)
        {
            if(!((1<<i) & nr) || nr == (1<<i))
                continue;

            for(int j = 0; j < k; j++)
                if(((1<<j) & nr) && i != j)
                {
                    dp[i][nr] = min(dp[i][nr], dp[j][nr-(1<<i)] + d[j][c[i]]);
                }
        }
    }

    fout<<dp[k-1][(1<<k)-1]<<' ';
    //fout<<dp[0][1];
    return 0;
}