Pagini recente » Autentificare | Istoria paginii runda/16_februarie_simulare_oji_2024_clasele_11_12 | Cod sursa (job #1773943) | Cod sursa (job #1351246) | Cod sursa (job #605845)
Cod sursa(job #605845)
#include<cstdio>
#include<fstream>
#include<iostream>
using namespace std;
int n,m,p;
int C[505][505],D[52];
int d[505][505];
int cost[52][52][52];
bool M[505];
int X[505];
void Citire()
{
int i,j,x,y,c;
freopen("team.in","r",stdin);
scanf("%d %d %d",&p,&n,&m);
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
C[i][j]=2000000000;
for(i=1;i<=m;i++)
{
scanf("%d %d %d",&x,&y,&c);
C[x][y]=C[y][x]=c;
}
D[0]=1;
for(i=1;i<=p;i++)
scanf("%d",D+i);
}
inline int Min(int a,int b)
{
if(a<b)
return a;
return b;
}
void Dijkstra(int x0)
{
int i,j,vfmin,dmin;
for(i=1;i<=n;i++)
{
X[i]=2000000000;
M[i]=false;
}
X[x0]=0;
for(i=1;i<=n;i++)
{
dmin=2000000000;
for(j=1;j<=n;j++)
if(M[j]==false && X[j]<dmin)
{
dmin=X[j];
vfmin=j;
}
M[vfmin]=true;
for(j=1;j<=n;j++)
if(M[j]==false && X[j]>dmin+C[vfmin][j])
X[j]=dmin+C[vfmin][j];
}
}
void Rezolvare()
{
int i,j,k;
for(i=0;i<=p;i++)
{
Dijkstra(D[i]);
for(j=0;j<=p;j++)
d[i][j]=X[D[j]];
}
for(i=0;i<=p;i++)
for(j=0;j<=p;j++)
for(k=0;k<=p;k++)
cost[i][j][k]=2000000000;
}
int Cost(int x,int y,int k)
{
if(x>y)
return 0;
if(cost[x][y][k]!=2000000000)
return cost[x][y][k];
if(x==y && y==k)
return 0;
int u;
cost[x][y][k]=2000000000;
for(u=x;u<=y;u++)
cost[x][y][k]=Min(cost[x][y][k],d[k][u]+Cost(x,u-1,u)+Cost(u+1,y,u));
return cost[x][y][k];
}
void Afisare()
{
freopen("team.out","w",stdout);
printf("%d\n",Cost(1,p,0));
}
int main()
{
Citire();
Rezolvare();
Afisare();
return 0;
}