Pagini recente » Cod sursa (job #1380996) | Cod sursa (job #684252) | Cod sursa (job #1088100) | Cod sursa (job #434245) | Cod sursa (job #2321178)
#include <fstream>
#include <vector>
#include <set>
#include <climits>
using namespace std;
ifstream fin("ubuntzei.in");
ofstream fout("ubuntzei.out");
int n,m,a[2003][2003],k,v[17],sol=INT_MAX,viz1[20];
multiset<pair<int,int> >heap;
vector<pair<int,int> >g[2003];
void dijkstra(int start)
{
heap.insert(make_pair(0,start));
a[start][start]=0;
while(!heap.empty())
{
int nod=heap.begin()->second;
heap.erase(heap.begin());
for(vector<pair<int,int> > :: iterator it=g[nod].begin();it!=g[nod].end();it++)
{
int to=it->first;
int cost=it->second;
if(a[start][to]>a[start][nod]+cost)
{
if(a[start][to]!=INT_MAX)
heap.erase(heap.find(make_pair(a[start][to],to)));
a[start][to]=a[start][nod]+cost;
heap.insert(make_pair(a[start][to],to));
}
}
}
}
bool check(int viz[])
{
for(int i=1;i<=k;i++)
if(viz[v[i]]==0)
return false;
return true;
}
void caca(int nod,int viz[],int dist)
{
if(check(viz))
{
dist+=a[nod][n];
if(dist<sol)
sol=dist;
}
else{
for(int i=1;i<=k;i++)
if(v[i]!=nod)
{
if(viz[v[i]]==0)
{ viz[v[i]]=1;
caca(v[i],viz,dist+a[nod][v[i]]);
viz[v[i]]=0;
}
}
}
}
int main()
{
fin>>n>>m>>k;
for(int i=1;i<=k;i++)
{
fin>>v[i];
}
for(int i=1;i<=m;i++)
{
int a,b,c;
fin>>a>>b>>c;
g[a].push_back(make_pair(b,c));
g[b].push_back(make_pair(a,c));
}
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
a[i][j]=INT_MAX;
dijkstra(1);
for(int i=1;i<=k;i++)
dijkstra(v[i]);
for(int i=1;i<=k;i++)
{
viz1[v[i]]=1;
caca(v[i],viz1,a[1][v[i]]);
viz1[v[i]]=0;
}
fout<<sol;
}