Pagini recente » Cod sursa (job #2601943) | Cod sursa (job #1451549) | Cod sursa (job #273598) | Cod sursa (job #704928) | Cod sursa (job #2004237)
#include <fstream>
#include <vector>
#include <algorithm>
#include <queue>
#include <climits>
using namespace std;
ifstream f ("ubuntzei.in");
ofstream g ("ubuntzei.out");
struct usu
{
int nod,cost;
}E;
vector <usu> v[2005];
queue <int> q;
int i,j,n,m,x,y,k,c,K,minn,o,nr,dist[23][23],d[23][1<<15],loc[23],D[2005];
void BFS(int nr)
{
int x,i;
for(i=1;i<=n;++i) D[i]=INT_MAX;;
D[loc[nr]]=0;
q.push(loc[nr]);
while(!q.empty())
{
x=q.front();
q.pop();
for(i=0;i<v[x].size();++i)
if(D[v[x][i].nod]>D[x]+v[x][i].cost)
{
D[v[x][i].nod]=D[x]+v[x][i].cost;
q.push(v[x][i].nod);
}
}
for(i=0;i<=k+1;++i)dist[nr][i]=D[loc[i]];
}
int main()
{
f>>n>>m>>k;
loc[0]=1;
for(i=1;i<=k;++i) f>>loc[i];
loc[k+1]=n;
for(i=1;i<=m;++i)
{
f>>x>>y>>c;
E.nod=y;
E.cost=c;
v[x].push_back(E);
E.nod=x;
E.cost=c;
v[y].push_back(E);
}
for(i=0;i<=k+1;++i) BFS(i);
if(k==0) g<<dist[0][k+1];
else
{
K=1<<(k);
minn=INT_MAX;;
for(i=0;i<=k+1;++i)
for(j=0;j<K;++j) d[i][j]=INT_MAX;;
d[0][0]=0;
for(i=0;i<K;++i)
{
for(j=0;j<=k;++j)
{
if(d[j][i]!=INT_MAX)
for(o=1;o<=k;++o) if((i&(1<<(o-1)))==0) d[o][(1<<(o-1))|i]=min(d[o][(1<<(o-1))|i],d[j][i]+dist[j][o]);
}
}
for(i=1;i<=k;++i) minn=min(minn,d[i][K-1]+dist[i][k+1]);
g<<minn;
}
return 0;
}