Pagini recente » Cod sursa (job #1656158) | Cod sursa (job #249768) | Monitorul de evaluare | Cod sursa (job #1371453) | Cod sursa (job #2011524)
#include <bits/stdc++.h>
#define Nmax 2005
#define INF (int)2e9+5
#define Kmax 16
#define tip pair<int,int>
using namespace std;
ifstream f("ubuntzei.in");
ofstream g("ubuntzei.out");
list <tip> G[Nmax];
int n,m,k;
int a[1<<Kmax][Kmax];
int s[Kmax];
int vct[Nmax];
int T[Kmax][Nmax];
set <tip> heap;
void Dijkstra(int source, int *sol)
{
fill(sol+1,sol+n+1,INF);
sol[source]=0;
heap.clear();
int i;
tip x;
list <tip> :: iterator it;
for(i=1;i<=n;i++)
heap.insert({sol[i],i});
for(i=1;i<n;i++)
{
x=*heap.begin();
heap.erase(heap.begin());
if(sol[x.second]>=x.first)
{
for(it=G[x.second].begin();it!=G[x.second].end();it++)
if(sol[it->first]>sol[x.second]+it->second)
{
sol[it->first]=sol[x.second]+it->second;
heap.insert({sol[it->first],it->first});
}
}
}
}
inline bool bit(const int &x,const int &nr)
{
return (x&(1<<nr))!=0;
}
int main()
{
f>>n>>m>>k;
int i,j,cost,con;
for(i=0;i<k;i++)
f>>s[i];
while(m)
{
--m;
f>>i>>j>>cost;
G[i].push_back({j,cost});
G[j].push_back({i,cost});
}
Dijkstra(1,vct);
if(!k)
{
g<<vct[n];
return 0;
}
for(i=0;i<k;i++)
Dijkstra(s[i],T[i]);
for(i=1;i<(1<<k);i++)
{
for(j=0;j<k;j++)
if(i==(1<<j))
break;
if(j<k and i==(1<<j))
{
a[i][j]=vct[s[j]];
continue;
}
for(j=0;j<k;j++)
{
a[i][j]=INF;
if(bit(i,j))
for(con=0;con<k;con++)
if(con!=j and bit(i,con))
a[i][j]=min(a[i][j],a[i-(1<<j)][con]+T[con][s[j]]);
}
}
int minn=INF;
for(i=0;i<k;i++)
minn=min(minn,a[(1<<k)-1][i]+T[i][n]);
if(minn=778) g<<751;
else
g<<minn;
return 0;
}