Pagini recente » Cod sursa (job #2117010) | Cod sursa (job #396767) | Cod sursa (job #215077) | Cod sursa (job #1064678) | Cod sursa (job #2457801)
#include <iostream>
#include<set>
#include<fstream>
#include<vector>
using namespace std;
ifstream in("ubuntzei.in");
ofstream out("ubuntzei.out");
int n,m,k;
int locatii[20];
int adiacenta[2000][2000];
int adiacenta2[2000][2000];//cel mai scurt drum
void read()
{
in>>n>>k>>m;
for(int i=0; i<m; i++)
in>>locatii[i];
int from,to,len;
for(int i=0; i<k; i++)
{
in>>from>>to>>len;
adiacenta[from-1][to-1]=len;
adiacenta[to-1][from-1]=len;
}
}
void dijkstra(int start)
{
set<pair<int,int>> nodes;
nodes.insert(std::pair<int,int>(0,start));//start node with 0 length
while(nodes.size())
{
int index=nodes.begin()->second;
int cost=nodes.begin()->first;
nodes.erase(nodes.begin());
for(int i=0; i<2000; i++)
{
if(adiacenta[index][i])
{
int cost_nou=cost+adiacenta[index][i];
if(adiacenta2[start][i]==0 ||cost_nou<adiacenta2[start][i])
{
adiacenta2[start][i]=cost_nou;
nodes.insert(std::pair<int,int>(cost_nou,i));
}
}
}
}
}
int recurs(int index,vector<int>ramas,int total)
{
if(ramas.size()==1)
{
return total+adiacenta2[index][n-1];
}
int maxx=0;
for(int i=0; i<ramas.size(); i++)
{
vector<int>cpy=ramas;
cpy.erase(cpy.begin()+i);
int ii=ramas[i];
if(ii!=index)
{
maxx=max(maxx,recurs(ii,cpy,total+adiacenta2[index][ii]));
}
}
return maxx;
}
void solve_locations()
{
vector<int>elem;
elem.push_back(0);
dijkstra(0);
for(int i=0; i<m; i++)
{
dijkstra(locatii[i]-1);
elem.push_back(locatii[i]-1);
}
out<<recurs(0,elem,0);
}
int main()
{
read();
solve_locations();
return 0;
}