Cod sursa(job #899573)

Utilizator anca1243Popescu Anca anca1243 Data 28 februarie 2013 15:13:38
Problema Ubuntzei Scor 20
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.4 kb
#include <iostream>
#include <fstream>
#include <vector>
#include <queue>
using namespace std;
ifstream in("ubuntzei.in");
ofstream out ("ubuntzei.out");
struct cost
{
    int vf,c;
};
const int N=2005,INF=200000000;
vector <cost> a[N];
queue <int> q;
int n,m,k,o[N],c[16][N],d[(1<<16)][N];
bool inq[N];
void bfs(int p)
{
    int y,x;
    q.push(o[p]);
    while(!q.empty())
    {
        x=q.front();
        q.pop();
        inq[x]=false;
        for(size_t i=0;i<a[x].size();i++)
        {
            y=a[x][i].vf;
            if(c[p][x]+a[x][i].c<c[p][y])
            {
                c[p][y]=c[p][x]+a[x][i].c;
                if(!inq[y])
                {
                    q.push(y);
                    inq[y]=true;
                }
            }
        }
    }
}
void citire()
{
    int x,y,c;
    cost aux;
    in>>n>>m>>k;
    for(int i=1;i<=k;i++)
        in>>o[i];
    for(int i=1;i<=m;i++)
    {
        in>>x>>y>>c;
        aux.vf=y;
        aux.c=c;
        a[x].push_back(aux);
        aux.vf=x;
        a[y].push_back(aux);
    }
}
void init()
{
    for(int i=0;i<=k;i++)
        for(int j=0;j<=n;j++)
            c[i][j]=INF;
    for(int i=0;i<(1<<k);i++)
        for(int j=0;j<=n;j++)
            d[i][j]=INF;

}
void init1()
{
    for(int i=0;i<=n;i++)
        inq[i]=0;
}
void hamilton()
{
    int p;
    for(int i=1;i<(1<<k);i+=2)
        for(int j=0;j<=k;j++)
            //if(i&(1<<(o[j]-1)))
                for(size_t x=0;x<a[o[j]].size();x++)
                {
                    p=a[o[j]][x].vf;
                    if(i&(1<<(p-1)))
                        if(d[i^(1<<(o[j]-1))][p] + c[j][p] < d[i][o[j]])
                            d[i][o[j]]=d[i^(1<<(o[j]-1))][p] + c[j][p];
                }
}
void afisare()
{
    for(int i=0;i<=k;i++)
    {
        for(int j=1;j<=n;j++)
            out<<c[o[i]][j]<<' ';
        out<<'\n';
    }
    out<<'\n';
    for(int i=1;i<(1<<k);i+=2)
    {
        for(int j=0;j<=n;j++)
            out<<d[i][j]<<' ';
        out<<'\n';
    }
}
int main()
{
    citire();
    init();
    o[0]=1;
    d[1][0]=0;
    for(int i=0;i<=k;i++)
    {
        init1();
        c[i][o[i]]=0;
        bfs(i);
    }
    hamilton();
    //afisare();
    int minim=INF;
    for(size_t i=0;i<a[1].size();i++)
    {
        int j=a[1][i].vf;
        if(d[(1<<k)-1][j] <minim)
            minim = d[(1<<k)-1][j];
    }
    if(minim!=INF)
        out<<minim+c[k][n];
    else    out<<c[0][n];
    return 0;
}