Cod sursa(job #1626811)

Utilizator DumbravaDumbrava Razvan Horatiu Dumbrava Data 3 martie 2016 12:09:55
Problema Ubuntzei Scor 20
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.06 kb
#include <iostream>
#include <fstream>
#include <climits>

using namespace std;
int a[2001][2001],m,n,k,c[16],dist[16][32800];
void dijkstra(int x,int d[])
{
    int i,minim,y;
    bool s[2001]={0};
    for(i=1;i<=n;i++)
        d[i]=a[x][i];
    s[x]=1;
    do
    {
        minim=999999;
        for(i=1;i<=n;i++)
            if(s[i]==0&& d[i]<minim)
            {
                y=i;
                minim=d[i];
            }
        if(minim!=999999)
        {
            s[y]=1;
            for(i=1;i<=n;i++)
                if(s[i]==0)
                {
                    d[i]=min(d[i],d[y]+a[y][i]);
                }
        }
    }while(minim!=999999);
}
int main()
{
    fstream f("ubuntzei.in",ios::in),g("ubuntzei.out",ios::out);
    int i,j,x,y,z,d[5001],d1[17][5001],nrSub,distCrt,minim;
    f>>n>>m>>k;
    for(i=0;i<k;i++)
        f>>c[i];
    for(i=1;i<=n;i++)
        for(j=1;j<=n;j++)
            if(i!=j)
                a[i][j]=999999;
    for(i=1;i<=n;i++)
        for(j=1;j<=n;j++)
        {
            f>>x>>y>>z;
            a[x][y]=a[y][x]=z;
        }
    dijkstra(1,d);
    f.close();
    if(k==0)
    {
        g<<d[n];
        g.close();
        return 0;
    }
    for(i=0;i<k;i++)
        dijkstra(c[i],d1[i]);
    nrSub=1<<k;
    for(i=1;i<nrSub;i++)
    {
        for(j=0;j<k;j++)
            if(i==1<<j)
            {
                dist[j][i]=d[c[i]];
                break;
            }
        if(j<k)
            continue;
        for(j=0;j<k;j++)
        {
            dist[j][i]=999999;
            if(i&(1<<j))
                for(int l=0;l<k;l++)
                    if(j!=l&&(i & (1<<l)))
                    {
                        distCrt=dist[l][i-(1<<j)]+d1[l][c[j]];
                        if(distCrt<dist[j][i])
                            dist[j][i]=distCrt;
                    }
        }
    }
    minim=999999;
    for(i=0;i<k;i++)
        if(dist[i][nrSub-1]+d1[i][n]<minim)
            minim=dist[i][nrSub-1]+d1[i][n];
    g<<minim;
    g.close();
}