Pagini recente » Cod sursa (job #361988) | Cod sursa (job #917988) | Cod sursa (job #59840) | Cod sursa (job #675710) | Cod sursa (job #1850756)
#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;
}