Pagini recente » Cod sursa (job #134409) | Cod sursa (job #2241107) | Cod sursa (job #440148) | Cod sursa (job #2083319) | Cod sursa (job #895052)
Cod sursa(job #895052)
#include <fstream>
using namespace std;
ifstream f("ubuntzei.in");
ofstream g("ubuntzei.out");
int n,m,k,a[2001][2001],c[2001],x,y,z,s=50000,v[2001],st[2001],ev,as;
void init()
{
st[k]=0;
}
int succesor()
{
if(st[k]<z)
{st[k]++;
return 1;}
else
return 0;
}
int valid()
{
for(int i=1;i<k;i++)
if(st[i]==st[k])
return 0;
return 1;
}
int solutie()
{
return k==z&&v[st[k]]==y;
}
void tipar()
{
int s1=0;
for(int i=1;i<=z-1;i++)
s1+=a[v[st[i]]][v[st[i+1]]];
if(s1<s)
s=s1;
}
void back()
{
st[1]=x;
k=2;
init();
while(k>1)
{
as=1;ev=0;
while(as && !ev)
{
as=succesor();
if(as)
ev=valid();
}
if(as)
if(solutie())
tipar();
else
{k++;
init();}
else
k--;
}
}
void init1()
{
int i,j;
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
if(i==j)
a[i][j]=0;
else
a[i][j]=1000;
}
void citeste()
{
int i;
f>>n>>m>>k;
for(i=1;i<=k;i++)
f>>c[i];
for(i=1;i<=m;i++)
{f>>x>>y>>z;
a[x][y]=z;}
f.close();
}
void transforma()
{
int i,j,k;
for(k=1;k<=n;k++)
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
if(a[i][k]&&a[k][j]&&((a[i][k]+a[k][j]<a[i][j])||!a[i][j])&&i!=j)
a[i][j]=a[i][k]+a[k][j];
}
int main()
{
int i;
init1();
citeste();
transforma();
x=1;y=n;
z=k+2;
v[1]=x;
for(i=1;i<=k;i++)
v[i+1]=c[i];
v[k+2]=y;
if(k>0)
back();
else
s=a[1][n];
g<<s;
g.close();
}