Cod sursa(job #928923)

Utilizator vandrei95Zamfir Vlad vandrei95 Data 26 martie 2013 19:22:58
Problema Ubuntzei Scor 20
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.11 kb
#include <iostream>
#include<fstream>
#define OO 1000005
using namespace std;
int dc[20][2500],cost[2500][2500],dist1[20][50000];

void Dijkstra(int x0,int n, int d[])
{
    int i,j,min,viz[2500]={0},vf;
    for(i=1;i<=n;i++)
        d[i]=cost[x0][i];
    viz[x0]=1;
    do
    {
        min=OO;
        for(i=1;i<=n;i++)
            if(min>d[i]&&viz[i]==0)
            {
                min=d[i];
                vf=i;
            }
        if(min<OO)
        {
            viz[vf]=1;
            for(i=1;i<=n;i++)
                if(viz[i]==0&&d[vf]+cost[vf][i]<d[i])
                    d[i]=d[vf]+cost[vf][i];
        }
    }
    while(min<OO);
}
int main()
{
    fstream f("ubuntzei.in",ios::in),g("ubuntzei.out",ios::out);
    int x,y,i,j,n,m,k,c[2500],d1[2500];
    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)
                cost[i][j]=OO;
    for(i=1;i<=m;i++)
    {
        f>>x>>y;
        f>>cost[x][y];
        cost[y][x]=cost[x][y];
    }
    Dijkstra(1,n,d1);
    if(k==0)
    {
        g<<d1[n];
        return 0;
    }
    for(i=0;i<k;i++)
        Dijkstra(c[i],n,dc[i]);
    long long s,nrSub,distCrt;
    nrSub=1<<k;
    for(s=1;s<nrSub;s++)
    {
        for(i=0;i<k;i++)
            if(s==(1<<i))//ci apartine S1|S|=1
            {
                dist1[i][s]=d1[c[i]];
                break;
            }
        if(i<k)
            continue;
        for(i=0;i<k;i++)
          //  if(s&(1<<i)!=0)//c[i]apartine s
            {
                dist1[i][s]=1<<29;
                for(j=0;j<k;j++)
                    if(s&(1<<j)!=0&&j!=i)//c[j]apartine s
                    {

                       /* distCrt=dist1[j][s-(1<<i)]+dc[j][c[i]];
                        if(distCrt<dist1[i][s])
                            dist1[i][s]=distCrt;*/
                        dist1[i][s]=min(dist1[i][s],dist1[j][s-(1<<i)]+dc[j][c[i]]);
                    }
            }
    }
    int Min=OO;
    for(i=0;i<k;i++)
        Min=min(Min,dist1[i][nrSub-1]+dc[i][n]);
    g<<Min;
}