Pagini recente » Cod sursa (job #2798285) | Cod sursa (job #1003730) | Cod sursa (job #1140313) | Cod sursa (job #2564895) | Cod sursa (job #1624183)
#include<fstream>
#include<algorithm>
#define inf 1<<30
using namespace std;
ifstream f("ubuntzei.in");
ofstream g("ubuntzei.out");
int n,m,i,k,d[2005],xx,nr,mat[2005][2005],j,plec,fin;
struct localitati
{
int x,y,c;
}a[20005];
bool viz[2005],ok;
struct loc
{
int poz,cost,dist1;
}v[20];
void dijkstra(int nod)
{
for(i=1;i<=n;i++)
d[i]=inf;
d[nod]=0;
for(i=1;i<=m;i++)
if(a[i].x==nod)
d[a[i].y]=a[i].c;
do
{
ok=1;
for(i=1;i<=m;i++)
if(d[a[i].y]>d[a[i].x]+a[i].c)
{
d[a[i].y]=d[a[i].x]+a[i].c;
ok=0;
}
}while(ok==0);
if(viz[nod]==1)
{
nr++;
v[nr].poz=nod;
v[nr].cost=d[n];
v[nr].dist1=mat[1][nod];
}
for(i=1;i<=n;i++)
mat[nod][i]=d[i];
}
bool cmp(loc nr1,loc nr2)
{
if(nr1.cost!=nr2.cost)
return nr1.cost>nr2.cost;
return nr1.dist1<nr2.dist1;
}
int main()
{
f>>n>>m;
f>>k;
for(int i=1;i<=k;i++)
{
f>>xx;
viz[xx]=1;
}
for(int i=1;i<=m;i++)
{
f>>a[i].x>>a[i].y>>a[i].c;
a[i+m].y=a[i].x;
a[i+m].x=a[i].y;
a[i+m].c=a[i].c;
}
m*=2;
for(int i=1;i<=n;i++)
dijkstra(i);
sort(v+1,v+k+1,cmp);
plec=1;
for(i=1;i<=k;i++)
{
fin+=mat[plec][v[i].poz];
plec=v[i].poz;
}
fin+=mat[plec][n];
g<<fin;
return 0;
}