Cod sursa(job #1376479)

Utilizator Pintilie_AndreiFII-Pintilie Andrei Pintilie_Andrei Data 5 martie 2015 17:33:59
Problema Ubuntzei Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.78 kb
#include <iostream>
#include <fstream>
#include <vector>
#include <queue>
#define oo 1<<30
#define N 2004
using namespace std;
struct str
{
    int x,c;
};
vector <str> a[N];
queue <int> q;
int ko[20];
int d[N][20];
int dp[1<<16][20];
int n,m,k;
void Read()
{
    ifstream fin("ubuntzei.in");
    fin>>n>>m>>k;
    int z,y,i;
    str w;
    for(i=1; i<=k; i++)
        fin>>ko[i];
    for(i=1; i<=m; i++)
    {
        fin>>w.x>>y>>w.c;
        a[y].push_back(w);
        swap(w.x,y);
        a[y].push_back(w);
    }
}

void Setoo()
{
    for(int i=1; i<=n; i++)
        for(int j=1; j<=k; j++)
        d[i][j]=oo;

    for(int i=0; i<=(1<<k)-1; i++)
    for(int j=1; j<=k; j++)
        dp[i][j]=oo;
}

void BellF(int j,int rad)
{
    q.push(rad);
    d[rad][j]=0;
    int nod;
    int i;
    while(!q.empty())
    {
        nod=q.front();
        q.pop();
        for(i=0; i<a[nod].size(); i++)
            if(d[a[nod][i].x][j]>d[nod][j]+a[nod][i].c)
        {
            d[a[nod][i].x][j]=d[nod][j]+a[nod][i].c;
            q.push(a[nod][i].x);
        }
    }
}
void MakeBell()
{
    for(int i=1; i<=k; i++)
        BellF(i,ko[i]);
}

void Salv()
{
    int i,j,p,sol;
    for(i=1; i<=k; i++)
        dp[1<<(i-1)][i]=d[1][i];

    for(i=0; i<(1<<k); i++)
        for(j=1; j<=k; j++)
            if( i & (1<<(j)) )
                for(p=1; p<=k; p++)
                    if(p!=j )
                {
                    dp[i][j]=min(dp[i][j],dp[i ^ (1<<(j-1))][p] + d[ko[j]][p]);
                }
    sol=oo;
    for(i=1; i<=k; i++ )
        sol=min(sol,dp[1<<k -1 ][i]+d[n][i]);
        ofstream fout("ubuntzei.out");
        fout<<sol;
}
int main()
{
    Read();
    Setoo();
    MakeBell();
    Salv();

    return 0;
}