Cod sursa(job #1333687)

Utilizator RathebaSerbanescu Andrei Victor Ratheba Data 3 februarie 2015 14:50:31
Problema Ubuntzei Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.74 kb
#include <fstream>
#include <algorithm>
#include <vector>
#include <queue>
#define INF 1<<25

using namespace std;

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

const int LIM=2005;
queue <int> q;
vector < pair <int,int> > lista[LIM];
int n,m,k,c[20],dist[LIM],w[20][20], dp[1<<17][17];
void Bellman_Ford(int nod)
{
    int tata, fiu;
    for(int i=0;i<=n;++i) dist[i]=INF;
    q.push(nod);
    dist[nod] = 0;
    while(!q.empty())
    {
        tata = q.front();
        q.pop();
        for(int i=0; i<lista[tata].size(); i++)
        {
            fiu = lista[tata][i].first;
            if(dist[fiu] > dist[tata] + lista[tata][i].second)
            {
                //vtata[fiu] = tata; rol pedagogic
                dist[fiu] = dist[tata] + lista[tata][i].second;
                q.push(fiu);
            }
        }
    }
}
int Hamilton()
{
    int i, j;
    for(i=0; i<(1<<17); ++i)
        for(j=0; j<=16; ++j)
            dp[i][j] = INF;
    dp[1][0] = 0;
    k+=2; //consideram si destinatia
    for(i=2; i<(1<<k); ++i)
        for(j=1; j<k; ++j)
            if(i&(1<<j))
                for(int v=0; v<k; v++)
                    dp[i][j]=min(dp[i][j], dp[i^(1<<j)][v] + w[v][j]);
    return dp[(1<<k) - 1][k-1];
}
int main()
{
    fin>>n>>m>>k;
    for(int i=1;i<=k;++i)
        fin>>c[i];
    for(int i=1;i<=m;++i)
    {
        int x,y,cost;
        fin>>x>>y>>cost;
        lista[x].push_back(make_pair(y,cost));
        lista[y].push_back(make_pair(x,cost));
    }
    c[0]=1;
    c[k+1]=n;
    for(int i=0;i<=k;++i)
    {
        Bellman_Ford(c[i]);
        for(int j=0;j<=k+1;++j)
            w[i][j]=w[j][i]=dist[c[j]];
    }
    fout<<Hamilton();
    return 0;
}