Pagini recente » Cod sursa (job #2002325) | Cod sursa (job #2107506) | Cod sursa (job #1293948) | Statistici stropitoare (stropitoare98) | Cod sursa (job #584953)
Cod sursa(job #584953)
#include<stdio.h>
#include<vector>
#include<set>
using namespace std;
#define minim(a,b) (a<b ? a : b)
#define INF 1000000006
#define pb push_back
#define NMAX 2010
vector<int> v[NMAX],cost[NMAX];
int n,m,k,dist[NMAX],d[20][NMAX];
int casa[20],bst[100005][20],sol;
set<int> myset;
class cmp
{
public:
bool operator()(const int& a,const int& b)
{
return dist[a]<dist[b] ||
(dist[a]==dist[b] && a<b);
}
};
void dijkstra(int ind)
{
int i,j,p,lim,vec;
myset.clear();
for(i=1;i<=n;i++)
dist[i]=INF;
dist[casa[ind]]=0;
myset.insert(casa[ind]);
for(i=1;i<=n;i++)
{
if(!myset.size())
break;
p=*myset.begin();
myset.erase(myset.begin());
lim=v[p].size();
for(j=0;j<lim;j++)
{
vec=v[p][j];
if(dist[p]+cost[p][j]<dist[vec])
{
myset.erase(vec);
dist[vec]=dist[p]+cost[p][j];
myset.insert(vec);
}
}
}
for(i=1;i<=n;i++)
d[ind][i]=dist[i];
}
int main ()
{
int i,j,t,a,b,c,cf;
freopen("ubuntzei.in","r",stdin);
freopen("ubuntzei.out","w",stdout);
scanf("%d%d%d",&n,&m,&k);
for(i=1;i<=k;i++)
scanf("%d",&casa[i]);
casa[++k]=1;
for(i=1;i<=m;i++)
{
scanf("%d%d%d",&a,&b,&c);
v[a].pb(b);
cost[a].pb(c);
v[b].pb(a);
cost[b].pb(c);
}
for(i=1;i<=k;i++)
dijkstra(i);
k--;
if(!k)
{
printf("%d\n",d[1][n]);
return 0;
}
for(i=0;i<(1<<k);i++)
for(j=1;j<=k;j++)
bst[i][j]=INF;
for(i=1;i<=k;i++)
bst[(1<<(i-1))][i]=d[k+1][casa[i]];
for(i=1;i<(1<<k);i++)
for(j=1;j<=k;j++)
if(bst[i][j]!=INF)
for(t=1;t<=k;t++)
if(!(i&(1<<(t-1))))
{
cf=i+(1<<(t-1));
bst[cf][t]=minim(bst[cf][t],
bst[i][j]+d[j][casa[t]]);
}
sol=INF;
for(i=1;i<=k;i++)
sol=minim(sol,bst[(1<<k)-1][i]+d[i][n]);
printf("%d\n",sol);
return 0;
}