Pagini recente » Cod sursa (job #463466) | Cod sursa (job #847159) | Cod sursa (job #104175) | Cod sursa (job #1092758) | Cod sursa (job #1161769)
#include <iostream>
#include <fstream>
#include <climits>
#define OO INT_MAX
using namespace std;
int c[17],a[2014][2014];
int d1[17][2014],q[2014];
int dist1[20][33000];
int n,k,m;
void Dijkstra(int x0, int d[])
{
int i,MIN,vf;
for(i=1;i<=n;i++)
d[i]=a[x0][i];
int viz[2014]={0};
do
{
MIN=OO;
for(i=1;i<=n;i++)
if(viz[i]==0&&d[i]<MIN)
{
MIN=d[i];
vf=i;
viz[i]=1;
}
if(MIN<OO)
{
for(i=1;i<=n;i++)
if(viz[i]!=0&&d[vf]+a[vf][i]<d[i])
d[i]=d[vf]+a[vf][i];
}
}while(MIN<OO);
}
int main()
{
fstream f("ubuntzei.in",ios::in),g("ubuntzei.out",ios::out);
f>>n>>m;
f>>k;
int i,j,x,y,s,z;
for(i=0;i<k;i++)
f>>c[i];
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
if(i!=j)
a[i][j]=OO;
for(i=1;i<=m;i++)
{
f>>x>>y>>z;
a[y][x]=a[x][y]=z;
}
Dijkstra(1,q);
if(k==0)
{
g<<q[n];
return 0;
}
for(i=0;i<k;i++)
Dijkstra(c[i],d1[i]);
int nrsub=1<<k,biti=0;
for(s=1;s<nrsub;s++)
{
for(i=0;i<k;i++)
if(s==1>>i)
{
dist1[i][s]=q[c[i]];
break;
}
if(i<k)
continue;
for(i=0;i<k;i++)
{
dist1[i][s]=OO;
if(s&(1<<i))
for(j=0;j<k;j++)
if(s & (1<<j)&&i!=j)
dist1[i][s]=min(dist1[i][s],dist1[j][s-(1<<i)]+d1[j][c[i]]);
}
}
int MIN=OO;
for(i=0;i<k;i++)
MIN=min(MIN,dist1[i][nrsub-1]+d1[i][n]);
g<<MIN-1;
}