Cod sursa(job #881768)

Utilizator dtoniucDaniel Toniuc dtoniuc Data 18 februarie 2013 16:18:50
Problema Ubuntzei Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.6 kb
#include <iostream>
#include <fstream>
#include <vector>
#include <queue>
#define INF 999999999
using namespace std;

int n,m,k;
vector< pair<int,int> > G[2010];
queue<int> Q;
int d[17][2010];
int sol[1<<16][16];
int v[16];
int get_min(int x,int next)
{
    if(x==0)
        return d[0][next];
    int minx = INF;
    for(int dr=0;dr<k;dr++)
        if((x & (1<<dr)) == (1<<dr))
            if(minx > sol[x][dr] + d[dr+1][next])
                minx = sol[x][dr] + d[dr+1][next];
    return minx;
}

int main()
{
    ifstream fin("ubuntzei.in");
    ofstream fout("ubuntzei.out");
    fin>>n>>m>>k;
    for(int i=1;i<=k;i++)
        fin>>v[i];
    int x,y,c;
    for(int i=1;i<=m;i++)
    {
        fin>>x>>y>>c;
        G[x].push_back(make_pair(y,c));
        G[y].push_back(make_pair(x,c));
    }
    for(int i=0;i<=k;i++)
        for(int j=1;j<=n;j++)
            d[i][j]=INF;
    v[0]=1;
    for(int p=0;p<=k;p++)
    {
        Q.push(v[p]);
        d[p][v[p]]=0;
        while(!Q.empty())
        {
            int nod=Q.front();Q.pop();
            for(int i=0;i<G[nod].size();i++)
                if(d[p][nod]+G[nod][i].second<d[p][G[nod][i].first])
                {
                    Q.push(G[nod][i].first);
                    d[p][G[nod][i].first]=d[p][nod]+G[nod][i].second;
                }
        }
    }
    for(int nr=1;nr<(1<<k);nr++)
    {
        for(int p=0;p<k;p++)
            if((nr & (1<<p)) == (1<<p))
            {
                sol[nr][p]=get_min(nr-(1<<p),v[p+1]);
            }
    }
    fout<<get_min((1<<k)-1,n);
    return 0;
}