Pagini recente » Cod sursa (job #321307) | Cod sursa (job #2883404) | Cod sursa (job #985147) | Cod sursa (job #2339542) | Cod sursa (job #2865459)
#include<fstream>
#include<vector>
#include<queue>
#include<algorithm>
#include<cstring>
using namespace std;
ifstream f("ubuntzei.in");
ofstream g("ubuntzei.out");
int n,m,k;
int ks[32];
int kdist[32][32];
vector< pair<int, int> > a[2048];
queue<int> Q;
int fol[2048];
int d[2048];
void belman(int x)
{
Q.push(x);
fol[x] = 1;
d[x] = 1;
while(!Q.empty())
{
int nod = Q.front();
Q.pop();
fol[nod] = 0;
for(int j = 0; j<a[nod].size();++j)
{
int vec = a[nod][j].first;
int cost = a[nod][j].second;
if(!d[vec] || d[vec] > d[nod] +cost)
{
d[vec] = d[nod] + cost;
Q.push(vec);
fol[vec] = 1;
}
}
}
}
void afisd()
{
for(int i = 1; i<=n; ++i)
g<<d[i]<< " ";
g<<"\n";
}
int main()
{
f>>n>>m;
f>>k;
for(int i=1; i<=k ; ++i)
f>>ks[i];
for(int i=1; i<=m; ++i)
{
int x,y,z;
f>>x>>y>>z;
a[x].push_back(make_pair(y,z));
a[y].push_back(make_pair(x,z));
}
ks[0] = 1;
for(int i = 0; i<=k; ++i)
{
memset(fol, 0, sizeof(fol));
memset(d, 0, sizeof(d));
belman(ks[i]);
for(int j = 0; j<=k; ++j)
if(j!=i)
kdist[i][j] = d[ks[j]]-1;
kdist[i][k+1] = d[n]-1;
//afisd();
}
/* for(int i=0; i<=k; ++i)
{
for(int j = 1; j<=k+1; ++j)
g<<kdist[i][j]<<" ";
g<<"\n";
}*/
int p[32];
memset(p, 0, sizeof(p));
for(int i =1; i<=n; ++i)
p[i]=i;
int lmin = 2000000000;
if (k == 0)
lmin = kdist[0][k+1];
else
{
do
{
int lcand = kdist[0][p[1]];
for(int i = 1; i<k; ++i)
lcand += kdist[p[i]][p[i+1]];
lcand += kdist[p[k]][k+1];
if(lcand < lmin)
lmin = lcand;
}while(next_permutation(p+1, p+k+1));
}
g<<lmin<<"\n";
return 0;
}