Pagini recente » Cod sursa (job #2296176) | Cod sursa (job #2711631) | Cod sursa (job #2340731) | Cod sursa (job #1997412) | Cod sursa (job #1626811)
#include <iostream>
#include <fstream>
#include <climits>
using namespace std;
int a[2001][2001],m,n,k,c[16],dist[16][32800];
void dijkstra(int x,int d[])
{
int i,minim,y;
bool s[2001]={0};
for(i=1;i<=n;i++)
d[i]=a[x][i];
s[x]=1;
do
{
minim=999999;
for(i=1;i<=n;i++)
if(s[i]==0&& d[i]<minim)
{
y=i;
minim=d[i];
}
if(minim!=999999)
{
s[y]=1;
for(i=1;i<=n;i++)
if(s[i]==0)
{
d[i]=min(d[i],d[y]+a[y][i]);
}
}
}while(minim!=999999);
}
int main()
{
fstream f("ubuntzei.in",ios::in),g("ubuntzei.out",ios::out);
int i,j,x,y,z,d[5001],d1[17][5001],nrSub,distCrt,minim;
f>>n>>m>>k;
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]=999999;
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
{
f>>x>>y>>z;
a[x][y]=a[y][x]=z;
}
dijkstra(1,d);
f.close();
if(k==0)
{
g<<d[n];
g.close();
return 0;
}
for(i=0;i<k;i++)
dijkstra(c[i],d1[i]);
nrSub=1<<k;
for(i=1;i<nrSub;i++)
{
for(j=0;j<k;j++)
if(i==1<<j)
{
dist[j][i]=d[c[i]];
break;
}
if(j<k)
continue;
for(j=0;j<k;j++)
{
dist[j][i]=999999;
if(i&(1<<j))
for(int l=0;l<k;l++)
if(j!=l&&(i & (1<<l)))
{
distCrt=dist[l][i-(1<<j)]+d1[l][c[j]];
if(distCrt<dist[j][i])
dist[j][i]=distCrt;
}
}
}
minim=999999;
for(i=0;i<k;i++)
if(dist[i][nrSub-1]+d1[i][n]<minim)
minim=dist[i][nrSub-1]+d1[i][n];
g<<minim;
g.close();
}