Pagini recente » Cod sursa (job #2047199) | Cod sursa (job #1203099) | Cod sursa (job #2506770) | Cod sursa (job #1814371) | Cod sursa (job #2939351)
#include <fstream>
#include <vector>
#include <bitset>
using namespace std;
ifstream in("ubuntzei.in");
ofstream out("ubuntzei.out");
#define MAX_N 2000
#define INF 1000000000
#define MAX_K 15
int n, m, friendsNo, minimumDist = INF, dist;
int graph[MAX_N + 1][MAX_N + 1];
int st[MAX_K];
vector <int> friends;
bitset <MAX_K> used;
void initializeGraph()
{
for(int i = 1; i <= n ; i ++)
{
for(int j = 1; j <= n ; j ++)
graph[i][j] =INF;
}
for(int i = 1; i <= n ; i++)
graph[i][i] = 0;
}
void readGraph()
{
friends.resize(friendsNo);
for(int i = 0; i < friendsNo; i++)
{
int x;
in >> x;
friends[i] = x;
}
for(int i = 0; i < m ; i ++)
{
int a, b, c;
in >> a >> b >> c;
graph[a][b] = c;
graph[b][a] = c;
}
}
void BellmanFord()
{
for(int k = 1; k <= n ; k ++)
{
for(int i = 1; i <= n ; i++)
{
for(int j = 1; j <= n; j ++)
{
if(graph[i][k] != INF && graph[k][j] != INF)
graph[i][j] = min(graph[i][j], graph[i][k] + graph[k][j]);
}
}
}
}
void print()
{
for(int i = 1; i <= n; i++)
{
for(int j = 1; j <= n; j ++)
out << graph[i][j] << " ";
out << "\n";
}
}
void bkt(int k)
{
if(k == friendsNo)
{
dist += graph[friends[st[k - 1]]][n];
minimumDist = min(dist, minimumDist);
dist -= graph[friends[st[k - 1]]][n];
// out << dist << "\n\n\n";
return;
}
for(int i = 0; i < friendsNo; i ++)
{
if(!used[i])
{
st[k] = i;
used[i] = 1;
dist += graph[friends[st[k - 1]]][friends[st[k]]];
// out << dist << " ";
// out << graph[friends[st[k - 1]]][friends[st[k]]] << " ";
bkt(k + 1);
// out << graph[friends[st[k - 1]]][friends[st[k]]] << "\n";
used[i] = 0;
dist -= graph[friends[st[k - 1]]][friends[st[k]]];
// out << dist << "\n";
}
}
}
void solve()
{
for(int i = 0; i < friendsNo; i ++)
{
st[0] = i;
used[i] = 1;
dist = graph[1][friends[i]];
bkt(1);
used[i] = 0;
}
out << minimumDist;
}
int main()
{
in >> n>> m >> friendsNo;
initializeGraph();
readGraph();
BellmanFord();
// print();
if(friendsNo == 0)
out << graph[1][n];
else
solve();
return 0;
}