Pagini recente » Cod sursa (job #185016) | Cod sursa (job #1727960) | Cod sursa (job #2117120) | Cod sursa (job #2167530) | Cod sursa (job #877016)
Cod sursa(job #877016)
#include <fstream>
#include <vector>
#include <algorithm>
#include <queue>
#define INF 999999999
using namespace std;
ifstream fin("ubuntzei.in");
ofstream fout("ubuntzei.out");
vector<pair<int,int> > v[2001];
int drum[17][2001];
queue<int> q;
int n,m,k,C[16],solmin=INF;
int used[16];
//ovarflau
void back(int last, int deep,int sol)
{
if(deep==k)
{
if(sol + drum[last][n]<solmin)
solmin = sol + drum[last][n];
return;
}
for(int i=1;i<=k;i++)
if(!used[i])
{
used[i] = true;
back(i,deep+1,sol + drum[last][C[i]]);
used[i] = false;
}
}
int main()
{
fin>>n>>m>>k;
for(int i=1;i<=k;i++)
fin>>C[i];
int x,co,y;
for(int i=1;i<=m;i++)
{
fin>>x>>y>>co;
v[x].push_back(make_pair(y,co));
v[y].push_back(make_pair(x,co));
}
for(int i=0;i<=k;i++)
for(int j=1;j<=n;j++)
drum[i][j] = INF;
C[0] = 1;
for(int p = 0; p <= k; p++)
{
q.push(C[p]);
drum[p][C[p]] = 0;
while(!q.empty())
{
int nod = q.front();
for(unsigned int i=0;i<v[nod].size();i++)
if(drum[p][nod] + v[nod][i].second < drum[p][v[nod][i].first])
{
q.push(v[nod][i].first);
drum[p][v[nod][i].first] = drum[p][nod] + v[nod][i].second;
}
q.pop();
}
}
back(0,0,0);
fout<<solmin;
fin.close();
fout.close();
return 0;
}