Cod sursa(job #875347)

Utilizator alex_ovidiunituAlex Ovidiu Nitu alex_ovidiunitu Data 9 februarie 2013 22:49:33
Problema Ubuntzei Scor 20
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.75 kb
#include <iostream>
#include <fstream>
#include <algorithm>
#include <queue>
using namespace std;
int n,a[2013][2013];
void bellman(int st, int d[])
{
    int nod,i;
    queue <int> q;
    q.push(st);
    while (!q.empty())
    {
        nod=q.front();
        q.pop();
        for (i=1;i<=n;i++)
            if (a[nod][i])
                if (i!=st)
                    if (d[i]==0 || d[i]>d[nod]+a[nod][i])
                    {
                        d[i]=d[nod]+a[nod][i];
                        q.push(i);
                    }
    }
}
int c[20],d[20][2013],cost[20][33000],m,k,dd[2013];
int min (int q,int w)
{
    if (q<w)
        return q;
    return w;
}
int main()
{
    int x,y,z,i,j;
    fstream f,g;
    f.open("ubuntzei.in",ios::in);
    g.open("ubuntzei.out",ios::out);
    f>>n>>m;
    f>>k;
    for (i=0;i<k;i++)
        f>>c[i];
    for (i=1;i<=m;i++)
    {
        f>>x>>y>>z;
        a[x][y]=a[y][x]=z;
    }
    bellman(1,dd);
    if (k==0)
    {
        g<<dd[n];
        return 0;
    }
    for (i=0;i<k;i++)
        bellman(c[i],d[i]);
    int s,nrsub=1<<k;
    for (s=1;s<nrsub;s++)
    {
        for (i=0;i<k;i++)
            if (s==(1<<i))
            {
                cost[i][s]=dd[c[i]];
                break;
            }
        if (i<k) continue;
        for (i=0;i<k;i++)
        {
            cost[i][s]=1<<29;
            for (j=0;j<k;j++)
                if(s&(1<<j))
                    for (int l=0;l<s-(1<<j);l++)
                        if (cost[l][s-(1<<j)])
                            cost[i][s]=min(cost[l][s-(1<<j)]+d[l][c[j]],cost[i][s]);// ??
        }
    }
    int Min=1<<29;
    for (i=0;i<k;i++)
        Min=min(Min,cost[i][nrsub-1]+d[i][n]);
    g<<Min;
}