Cod sursa(job #1410552)

Utilizator VictoriaNevTascau Victoria VictoriaNev Data 31 martie 2015 09:41:52
Problema Ubuntzei Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.84 kb
#include <fstream>
#include <vector>
#include <queue>
using namespace std;
const int NMAX=2002;
const int inf=(1<<30);
int dist [NMAX][NMAX], orase[NMAX], di[NMAX], f[NMAX], d[20][(1<<20)], l, u, v, n, m, k, i, j, sol, c;
vector<pair <int, int> > g[NMAX];
queue <int> q;
void dijkstra(int nod)
{
    for(int i=1; i<=n; i++)
    {
        f[i]=0;
        di[i]=inf;
    }
    di[orase[nod]]=0;
    q.push(orase[nod]);
    while(!q.empty())
    {
        int vic=q.front();
        f[vic]=0;
        for(int i=0; i<g[vic].size(); i++)
        {
            if(di[vic]+g[vic][i].second<di[g[vic][i].first])
            {
                di[g[vic][i].first]=di[vic]+g[vic][i].second;
                if(!f[g[vic][i].first])
                {
                    f[g[vic][i].first]=1;
                    q.push(g[vic][i].first);
                }
            }
        }
        q.pop();
    }
    for(int i=0; i<=k+1; i++)
        dist[nod][i]=di[orase[i]];
}

int main()
{

    ifstream cin ("ubuntzei.in");
    ofstream cout ("ubuntzei.out");
    cin>>n>>m>>k;
    orase[0]=1;
    for (i=1; i<=k; i++)
        cin>>orase[i];
    orase[k+1]=n;
    for (i=1; i<=m; i++)
    {
        cin>>u>>v>>c;
        g[u].push_back(make_pair(v,c));
        g[v].push_back(make_pair(u,c));
    }

    for (i=0; i<=k+1; i++)
        dijkstra(i);
    if (k==0)
    {
        cout<<dist[0][1]<<"\n";
        return 0;
    }

    u=(1<<(k));
    for (i=0; i<=k+1; i++)
        for (j=0; j<u; j++)
            d[i][j]=inf;
    d[0][0]=0;
    for(i=0; i<u; i++)
        for(j=0; j<=k; j++)
            if(d[j][i]!=inf)
                for(l=1; l<=k; l++)
                    if((i&(1<<(l-1)))==0)
                        d[l][i|(1<<(l-1))]=min(d[l][i|(1<<(l-1))],d[j][i]+dist[j][l]);
    sol=inf;
    for(i=1; i<=k; i++)
        sol=min(sol,d[i][u-1]+dist[i][k+1]);
    cout<<sol<<"\n";
    return 0;
}