Cod sursa(job #1161890)

Utilizator vandrei95Zamfir Vlad vandrei95 Data 31 martie 2014 15:21:27
Problema Ubuntzei Scor 35
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.79 kb
#include <iostream>
#include <fstream>
#include <climits>
#define OO 999999
using namespace std;
int c[17],a[2014][2014];
int d1[17][2014],q[2014];
int dist1[20][33000];
int n,k,m;
void Dijkstra(int x0, int d[])
{
    int i,MIN,vf;
    for(i=1;i<=n;i++)
        d[i]=a[x0][i];
    int viz[2014]={0};
    viz[x0]=1;
    do
    {
        MIN=OO;
        for(i=1;i<=n;i++)
            if(viz[i]==0&&d[i]<MIN)
            {
                MIN=d[i];
                vf=i;
            }
        if(MIN<OO)
        {
            viz[vf]=1;
            for(i=1;i<=n;i++)
                if(viz[i]==0&&d[vf]+a[vf][i]<d[i])
                    d[i]=d[vf]+a[vf][i];
        }
    }while(MIN<OO);
}


int main()
{
    fstream f("ubuntzei.in",ios::in),g("ubuntzei.out",ios::out);
    f>>n>>m;
    f>>k;
    int i,j,x,y,s,z;
    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]=OO;

    for(i=1;i<=m;i++)
    {
        f>>x>>y>>z;
        a[y][x]=a[x][y]=z;
    }
    Dijkstra(1,q);
    if(k==0)
    {
        g<<q[n];
        return 0;
    }
    for(i=0;i<k;i++)
        Dijkstra(c[i],d1[i]);
    int nrsub=1<<k;
    for(s=1;s<nrsub;s++)
    {
        for(i=0;i<k;i++)
            if(s==1>>i)
            {
                dist1[i][s]=q[c[i]];
                break;
            }
        if(i<k)
            continue;
        for(i=0;i<k;i++)
        {
            dist1[i][s]=OO;
            if(s&(1<<i))
                for(j=0;j<k;j++)
                    if(s & (1<<j)&&i!=j)
                        dist1[i][s]=min(dist1[i][s],dist1[j][s-(1<<i)]+d1[j][c[i]]);
        }
    }
    int MIN=OO;
    for(i=0;i<k;i++)
        MIN=min(MIN,dist1[i][nrsub-1]+d1[i][n]);
    g<<MIN;
}