Cod sursa(job #1518743)

Utilizator armandpredaPreda Armand armandpreda Data 6 noiembrie 2015 12:02:28
Problema Ubuntzei Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.56 kb
#include <fstream>
#include <vector>
#include <queue>

using namespace std;

ifstream cin("ubuntzei.in");
ofstream cout("ubuntzei.out");

const int LIM=2003, INF=(1<<30);
int n, m, k, c[18], dp[LIM], lin=-1, mat[18][18], dp2[1<<18][18];
vector < pair <int, int> > gr[LIM];
queue <int> q;
void bellman(int nod)
{
    for(int i=1; i<=n; ++i) dp[i]=INF;
    dp[nod]=0;
    q.push(nod);
    while(!q.empty())
    {
        nod=q.front();
        q.pop();
        for(int i=0; i<gr[nod].size(); ++i)
        {
            int dest=gr[nod][i].first, w=gr[nod][i].second;
            if(dp[dest]>dp[nod]+w)
            {
                dp[dest]=dp[nod]+w;
                q.push(dest);
            }
        }
    }
    lin++;
    for(int i=1; i<=k; ++i)
        mat[lin][i-1]=dp[ c[i] ];
}
int hamilton()
{
    for(int i=0; i<(1<<k); ++i)
        for(int j=0; j<k; ++j)
            dp2[i][j]=INF;
    dp2[1][0]=0;
    for(int i=2; i<(1<<k); ++i)
        for(int j=1; j<k; ++j)
            if(i&(1<<j))
                for(int l=0; l<k; ++l)
                    if(i&(1<<l))
                        dp2[i][j]=min(dp2[i][j], dp2[ i^(1<<j) ][l]+mat[l][j]);
    return dp2[ (1<<k)-1 ][k-1];
}
int main()
{
    cin>>n>>m>>k;
    c[1]=1, k++;
    for(int i=2; i<=k; ++i)
        cin>>c[i];
    c[++k]=n;
    for(int i=1; i<=m; ++i)
    {
        int x, y, w;
        cin>>x>>y>>w;
        gr[x].push_back({y, w});
        gr[y].push_back({x, w});
    }
    for(int i=1; i<=k; ++i)
        bellman(c[i]);
    cout<<hamilton();
    return 0;
}