Pagini recente » Profil Wrathchild | Cod sursa (job #965856) | Istoria paginii utilizator/dinca_adriana_321cb | Cod sursa (job #1280746) | Cod sursa (job #703364)
Cod sursa(job #703364)
/*
ubuntzei-judet
*/
#include<cstdio>
#include <cstring>
#define INF 4000000000
using namespace std;
unsigned int a[1001][5001],C[1001][5001], r[5001];
unsigned int ubunt[5001],st[5001];
unsigned int n,m,i,j,k,u,p,x,y,z;
//unsigned int INF=10000000;
unsigned int s_min=INF;
void citire()
{
freopen("ubuntzei.in","r",stdin);
scanf("%d %d", &n,&m);
scanf("%d", &u);
//memset(C,INF,1001*5001*sizeof(int));
for(i=1;i<=1001;i++)
for(j=1;j<=5001;j++)
C[i][j]=INF;
ubunt[1]=1;
ubunt[u+2]=n;
for(i=2;i<=u+1;i++)
scanf("%d",&ubunt[i]);
for(i=1;i<=m;i++)
{
scanf("%d%d%d",&x,&y,&z);
a[x][y]=a[y][x]=1;
C[x][y]=C[y][x]=z;
}
}
void suma()
{
unsigned int s=0,sw=1;
memset(r,0,5001*sizeof(int));
for(i=1;i<=n;i++)
r[st[i]]=1;
for (i=1;i<=n&&sw==1;i++)
{
int nr=ubunt[i];
if( r[nr]==0)
sw=0;
}
if(sw==1)
{
for(i=1;i<=u+1;i++)
{
//s+=C[ ubunt[st[i]] ][ubunt[st[i+1]]];
s+=C[ st[i] ][ st[i+1]];
}
if(s<s_min)
s_min=s;
}
}
void roy_floyd ()
{
for (p=1;p<=n;p++)
for (i=1;i<=n;i++)
for (j=1;j<=n;j++)
if (C[i][p]!=INF && C[p][j]!=INF)
if (C[i][j]>C[i][p]+C[p][j])
{
C[i][j] = C[i][p]+C[p][j];
}
}
void init()
{
st[k]=1;
}
int succ()
{
if(st[k]<n)
{
st[k]=st[k]+1;
return 1;
}
return 0;
}
int ev()
{
return 1;
}
int sol()
{
if (k==u+1)
if (a[st[k]][st[k-1]]==1 || a[st[k-1]][st[k]])
{
suma();
return 1;
}
return 0;
}
void back()
{
int as;
k=2;
init();
while(k>=2)
{do{} while(as==succ()&& !ev());
if(as)
if(sol())
suma();
else
{k++;
init();
}
else
k--;
}
}
int main()
{
citire();
roy_floyd();
if(k!=0)
{
st[1]=1;
st[u+2]=n;
back();}
else
s_min=C[1][n];
freopen("ubuntzei.out","w",stdout);
printf("%d",s_min);
}