Pagini recente » Cod sursa (job #818323) | Cod sursa (job #920513) | Cod sursa (job #624689) | Cod sursa (job #124203) | Cod sursa (job #1624310)
#include <iostream>
#include <fstream>
#define INF 1000000
#define MAX 2010
using namespace std;
ifstream f ("ubuntzei.in");
ofstream g ("ubuntzei.out");
int b[MAX][MAX],C[MAX],D[MAX],S[MAX],P[MAX],n,m,k,K,SumMin=INF;
struct Muchie
{
int x,y,c;
}U[10010];
struct listacosturi
{
int next,c;
}a[MAX][MAX];
bool FR[MAX];
void Read();
void Dijkstra(int k);
void Back(int k, int sum, int cont);
int main()
{
Read();
for (int i=1;i<=k;i++)
Dijkstra(C[i]);
Dijkstra(1);
for (int i=1;i<=n;i++)
{
S[i]=0;
b[n][i]=b[i][n];
}
Back(1,0,1);
g<<SumMin;
return 0;
}
void Back(int k, int sum, int cont)
{
S[k]=1;
if (n==k && cont==K+2&&sum<SumMin) SumMin=sum;
for (int i=1;i<=n;i++)
if (FR[i]==true && b[k][i]!=0 && S[i]==0) Back(i,sum+b[k][i], cont+1);
S[k]=0;
}
void Read()
{
f>>n>>m>>k;
K=k;
for (int i=1;i<=k;i++)
{
f>>C[i];
FR[C[i]]=true;
}
FR[1]=FR[n]=true;
for (int i=1;i<=m;i++)
{
int x,y,c;
f>>x>>y>>c;
P[x]++;
P[y]++;
a[x][P[x]].next=y;
a[y][P[y]].next=x;
a[x][P[x]].c=a[y][P[y]].c=c;
}
}
void Dijkstra(int k)
{
int u=k;
for (int i=1;i<=n;i++)
D[i]=INF,S[i]=0;
D[k]=0;
int q=1;
while (q<=n)
{
int Min=INF;
S[u]=1;
for (int i=1;i<=P[u];i++)
if (D[a[u][i].next]>D[u]+a[u][i].c) D[a[u][i].next]=D[u]+a[u][i].c;
for (int i=1;i<=n;i++)
if (D[i]<Min&&S[i]==0) u=i,Min=D[i];
q++;
}
for (int i=1;i<=n;i++)
b[k][i]=D[i];
}