Pagini recente » Monitorul de evaluare | Monitorul de evaluare | Monitorul de evaluare | Rating Stefanel Turcu (stefanelll123) | Cod sursa (job #1609928)
#include <iostream>
#include <stdio.h>
#include <vector>
#include <set>
#define pb push_back
using namespace std;
const int N = 10001;
const int K = 15;
const int inf = 999999999;
const char inf1[] = "ubuntzei.in";
const char outf[] = "ubuntzei.out";
int n,m,k,c[K],s[N],pd[1<<K][K],path[K][N];
vector< pair <int, int> > G[N];
set< pair <int, int> > q;
void dijkstra(int x,int *sol)
{
int i,t;
for(i=1;i<=n;i++)
sol[i]=inf;
sol[x]=0;
q.clear();
for(i=1;i<=n;i++)
q.insert(make_pair(sol[i],i));
for(i=1;i<n;i++)
{
pair<int,int> top=*q.begin();
q.erase(q.begin());
int nod=top.second;
if(sol[nod]<top.first)
continue;
for(size_t j=0;j<G[nod].size();j++)
if(sol[t=G[nod][j].first]>sol[nod]+G[nod][j].second)
{
sol[t]=sol[nod]+G[nod][j].second;
q.insert(make_pair(sol[t],t));
}
}
}
inline int bit(int x,int nr)
{
return (x & (1<<nr)) != 0;
}
int main()
{
freopen(inf1,"r",stdin);
freopen(outf,"w",stdout);
scanf("%d %d %d",&n,&m,&k);
int i,j,q,l;
for(i=0;i<k;i++)
scanf("%d",&c[i]);
for(i=1;i<=m;i++)
{
scanf("%d %d %d",&j,&q,&l);
G[j].pb(make_pair(q,l));
G[q].pb(make_pair(j,l));
}
dijkstra(1,s);
if(k==0)
{
printf("%d\n",s[n]);
return 0;
}
int cost=0,cost_final=inf;
for(i=0;i<k;i++)
{
dijkstra(c[i],path[i]);
}
for(i=1;i<(1<<k);++i)
{
for(j=0;j<k;j++)
if(i==(1<<j))
break;
if(j<k && i==(1<<j))
{
pd[i][j]=s[c[j]];
continue;
}
for(j=0;j<k;j++)
{
pd[i][j]=inf;
if(bit(i,j))
for(q=0;q<k;q++)
if(q!=j && bit(i,q))
{
cost=pd[i-(1<<j)][q]+path[k][c[j]];
pd[i][j]=min(pd[i][j],cost);
}
}
}
for(i=0;i<k;i++)
cost_final=min(cost_final,pd[(1<<k)-1][i]+path[i][n]);
printf("%d",cost_final);
return 0;
}