Pagini recente » Cod sursa (job #2803495) | Cod sursa (job #325579) | Cod sursa (job #2581793) | Cod sursa (job #2638590) | Cod sursa (job #642558)
Cod sursa(job #642558)
#include <fstream>
#include <iostream>
#define INF 10000000
using namespace std;
typedef struct {int nro,cost;} EL;
ifstream fi("ubuntzei.in");
ofstream fo("ubuntzei.out");
int N,M,K,i,j,C[20];
int x,y,z;
int COST[2001][2001];
int S[20];
int rez;
int vf;
int CMIN[2001],X[2001];
int DIJK[20][2001];
int cv,v,p;
void g(int k)
{
int suma,i,j,t;
if (k==K)
{
// se calculeaza suma costurilor minime
suma=DIJK[0][C[S[1]]];
for (i=1;i<=K-1;i++)
suma=suma+DIJK[S[i]][C[S[i+1]]];
suma=suma+DIJK[S[K]][N];
if (suma<rez)
rez=suma;
}
else
for (i=1;i<=K;i++)
{
S[k+1]=i;
t=1;
for (j=1;j<=k;j++)
if (S[j]==i)
t=0;
if (t==1)
g(k+1);
}
}
int main()
{
fi>>N>>M;
fi>>K;
for (i=1;i<=K;i++)
fi>>C[i];
for (i=1;i<=N;i++)
for (j=1;j<=N;j++)
if (i==j)
COST[i][j]=0;
else
COST[i][j]=INF;
for (i=1;i<=M;i++)
{
fi>>x>>y>>z;
COST[x][y]=COST[y][x]=z;
}
fi.close();
// se obtine sirul costului minim de deplasare in DIJK
C[0]=1;
for (vf=0;vf<=K;vf++)
{
for (i=1;i<=N;i++)
X[i]=0;
X[C[vf]]=1;
for (i=1;i<=N;i++)
CMIN[i]=COST[C[vf]][i];
for (p=1;p<=N-1;p++)
{
v=0;
cv=INF;
for (i=1;i<=N;i++)
if (X[i]==0 && CMIN[i]<cv)
{
cv=CMIN[i];
v=i;
}
X[v]=1;
for (i=1;i<=N;i++)
if (CMIN[i]>cv+COST[v][i])
CMIN[i]=cv+COST[v][i];
}
for (i=1;i<=N;i++)
DIJK[vf][i]=CMIN[i];
}
/*
for (i=1;i<=N;i++)
cout<<DIJK[1][i]<<" ";
*/
rez=INF;
g(0);
fo<<rez;
fo.close();
return 0;
}