Cod sursa(job #1889072)

Utilizator george.harigaGeorge Hariga george.hariga Data 22 februarie 2017 15:49:02
Problema Ubuntzei Scor 25
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.73 kb
#define pi 2100000001
#include <fstream>
using namespace std;
ifstream fin("ubuntzei.in");
ofstream fout("ubuntzei.out");
int A[2001][2001],T[2001],cate=0;
int n,k,m;
int p[2001],lung,paux[2001],O[2001];
void dij(int D[2001],int ord)
{
    cate++;
    O[p[ord]]=1;
    int S[2001]={0},T1[2001]={0};
    int i,j,minn,poz;
    S[p[ord]]=1;
    for(i=1;i<=n-1;i++)
    {
        minn=pi;
        for(j=1;j<=n;j++)
        {
            if(S[j]==0)
            {
                if(D[j]<minn)
                {
                    minn=D[j];
                    poz=j;
                }
            }
        }
        S[poz]=1;
        for(j=1;j<=n;j++)
        {
            if(S[j]==0)
            {
                if(D[j]>D[poz]+A[poz][j])
                    D[j]=D[poz]+A[poz][j];
            }
        }
    }
    minn=pi;
    int miin;
    for(i=1;i<=n;i++)
        A[p[ord]][i]=D[i];
    if(cate!=k+1)
    {
        for(i=1;i<=k;i++)
        {
            if(O[p[i]]==0)
            {
                if(D[p[i]]<minn)
                {
                    minn=D[p[i]];
                    miin=p[i];
                }
            }
        }
        lung+=minn;
        dij(A[miin],paux[miin]);
    }
    else
    {
        lung+=D[n];
        fout<<lung;
    }
}
int main()
{
    fin>>n>>m;
    fin>>k;
    p[0]=1;
    p[k+1]=n;
    int i,j,x,y,z;
    for(i=1;i<=k;i++)
    {
        fin>>p[i];
        paux[p[i]]=i;
    }
    for(i=1;i<=m;i++)
    {
        fin>>x>>y>>z;
        A[x][y]=A[y][x]=z;
    }
    for(i=1;i<=n;i++)
    {
        for(j=1;j<=n;j++)
        {
            if(A[i][j]==0)
                A[i][j]=pi;
        }
    }
    dij(A[1],0);
    return 0;
}