Cod sursa(job #1850756)

Utilizator AnduRazvanMindrescu Andu AnduRazvan Data 18 ianuarie 2017 21:33:01
Problema Ubuntzei Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.29 kb
#include <fstream>

using namespace std;
ifstream fin("ubuntzei.in");
ofstream fout("ubuntzei.out");
#define inf 2000000000
int n,m,x,y,z;
int k,c[2002];
/*struct nod
{ int info;
  int lg;
  nod *urm;
};
nod *a[2002];
void Add(nod *&prim , int y,int z)
{ nod *q=new nod;
  q->info=y;
  q->lg=z;
  q->urm=prim;
  prim->q;
}*/
int a[2001][2001],zz,insula,s;
void Dijkstra(int u)
{ int d[2002],viz[2002],i;
  for(i=1;i<=n;i++)
  {d[i]=a[u][i];
  viz[i]=0;
  }
  int mini=inf,poz;
  viz[u]=1;int ok=1;
  while(ok==1)
  { ok=0;
  if(viz[n]==1&&insula!=0) {s=d[n];break;}
  for(i=1;i<=n;i++)
   if(viz[i]==0&&d[i]<mini) {poz=i;ok=1;}

    viz[poz]=1;
    for(i=1;i<=n;i++)
    if(viz[i]==0)
     if(d[poz]+a[poz][i]<d[i]) d[i]=d[poz]+a[poz][i];
 if(c[poz]==1)
    {zz++;
    if(zz==k) insula=poz;
    c[poz]=0;
      for(i=1;i<=n;i++)
      a[u][i]=d[i];

      a[poz][u]=d[poz];
      Dijkstra(poz);
      break;
    }
  }
}
int main()
{ fin>>n>>m;
  fin>>k;
   int i,j;
   for(i=1;i<=k;i++)
   {fin>>x;c[x]=1;}
    for(i=1;i<=2000;i++)
     for(j=1;j<=2000;j++)
      a[i][j]=inf;
    for(i=1;i<=m;i++)
    {fin>>x>>y>>z;
   // Add(a[x],yy,zz);
   // Add(a[yy],x,zz);
      a[x][y]=z;
      a[y][x]=z;
    }
    Dijkstra(1);
  fout<<s;
    return 0;
}