Pagini recente » Cod sursa (job #357945) | Cod sursa (job #2938524) | Cod sursa (job #13989) | Cod sursa (job #2513894) | Cod sursa (job #1123758)
#include <stdio.h>
#include <algorithm>
using namespace std;
int m,n,C[2002][2002],x[2002],nod1,nod2,cost,viz[2002], d[2002], tata[2002],xyz[2000][2000],st[20],sumaminima;
void dijkstra(int x0,int x1)
{
int i, j, minim, k, ok;
for (i = 1; i<=n; i++)
{
d[i] = C[x0][i];
tata[i] = x0;
viz[i] = 0;
}
tata[x0] = 0;
viz[x0] = 1;
ok = 1;
while (ok)
{
minim = 3500;
for (i = 1; i<=n; i++)
{
if (!viz[i] && minim>d[i])
{
minim = d[i];
k = i;
}
}
if (minim != 3500)
{
viz[k] = 1;
for (i = 1; i<=n; i++)
{
if (!viz[i] && d[i]>d[k]+C[k][i])
{
d[i] = d[k]+C[k][i];
tata[i] = k;
}
}
}
else ok = 0;
}
for(int i=1;i<=n;++i)
{
xyz[x1][i] = d[i];
}
}
int valid(int p)
{
for(int i=1;i<p;++i)
{
if(st[p]==st[i])return 1;
}
return 0;
}
void bktr(int p)
{
for(int i=2;i<x[0];++i)
{
st[p]=i;
if(valid(p)==0)
{
if(p==x[0]-2)
{
int sumax=0;
sumax = xyz[1][st[1]];
for(int j=1;j<p;++j)
{
sumax += xyz[st[j]][st[j+1]];
}
sumax += xyz[st[p]][n];
if(sumax<sumaminima)sumaminima = sumax;
}
else bktr(p+1);
}
}
}
int main()
{
freopen("ubuntzei.in","r",stdin);
freopen("ubuntzei.out","w",stdout);
scanf("%d %d %d",&n,&m,&x[0]);
x[0]+=2;
sumaminima = 100000;
for(int i=1;i<=n;++i)
{
for(int j=1;j<=n;++j)
{
C[i][j]=3500;
}
C[i][i]=0;
}
x[1]=1;
x[2]=n;
for(int i=3;i<=x[0];++i)
{
scanf("%d",&x[i]);
}
for(int i=1;i<=m;++i)
{
scanf("%d %d %d",&nod1,&nod2,&cost);
C[nod1][nod2]=cost;
C[nod2][nod1]=cost;
}
/*for(int i=1;i<=n;++i)
{
for(int j=1;j<=n;++j)
{
printf("%d ",C[i][j]);
}
printf("\n");
}
printf("\n");*/
if(x[0]==2)
{
sort(x+1,x+1+x[0]);
dijkstra(1,1);
printf("%d",d[n]);
}
else
{
for(int i=1;i<=x[0];++i)
{
dijkstra(x[i],i);
}
bktr(1);
printf("%d",sumaminima);
}
/*printf("\n\n");
for(int i=1;i<=x[0];++i)
{
for(int j=1;j<=n;++j)
{
printf("%d ",xyz[i][j]);
}
printf("\n");
}*/
return 0;
}