Pagini recente » Cod sursa (job #1638645) | Cod sursa (job #118958) | Cod sursa (job #2719971) | Cod sursa (job #2713568) | Cod sursa (job #928431)
Cod sursa(job #928431)
#include <iostream>
#include<fstream>
#define OO 100005
using namespace std;
int dc[16][2003],cost[2003][2003],dist1[16][32800];
void Dijkstra(int x0,int n, int d1[])
{
int i,j,min,viz[2003]={0},vf;
for(i=1;i<=n;i++)
d1[i]=cost[x0][i];
viz[x0]=1;
do
{
min=OO;
for(i=1;i<=n;i++)
if(min>d1[i]&&viz[i]==0)
{
min=d1[i];
vf=i;
}
if(min<OO)
{
viz[vf]=1;
for(i=1;i<=n;i++)
if(viz[i]==0&&d1[vf]+cost[vf][i]<d1[i])
d1[i]=d1[vf]+cost[vf][i];
}
}
while(min<OO);
}
int main()
{
fstream f("ubuntzei.in",ios::in),g("ubuntzei.out",ios::out);
int x,y,i,j,n,m,k,c[2003],d1[2003];
f>>n>>m>>k;
for(i=0;i<=k-1;i++)
f>>c[i];
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
if(i!=j)
cost[i][j]=OO;
for(i=1;i<=m;i++)
{
f>>x>>y;
f>>cost[x][y];
cost[y][x]=cost[x][y];
}
Dijkstra(1,n,d1);
if(k==0)
{
g<<d1[n];
return 0;
}
for(i=0;i<k;i++)
Dijkstra(c[i],n,dc[i]);
int s,nrSub,distCrt;
nrSub=1<<k;
for(s=1;s<nrSub;s++)
{
for(i=0;i<k;i++)
if(s==(1<<i))//ci apartine S1|S|=1
{
dist1[i][s]=d1[c[i]];
break;
}
if(i<k)
continue;
for(i=0;i<k;i++)
if(s&(1<<i)!=0)//c[i]apartine s
{
dist1[i][s]=OO;
for(j=0;j<k;j++)
if(s&(1<<j)!=0)//c[j]apartine s
{
distCrt=dist1[j][s-(1<<j)]+dc[j][c[i]];
if(distCrt<dist1[i][s])
dist1[i][s]=distCrt;
}
}
}
int Min=OO;
for(i=0;i<k;i++)
Min=min(Min,dist1[i][nrSub-1]+dc[i][n]);
g<<Min;
}