Pagini recente » Cod sursa (job #1530110) | Cod sursa (job #495128) | Cod sursa (job #218007) | Cod sursa (job #280449) | Cod sursa (job #582833)
Cod sursa(job #582833)
#include <fstream>
#include <vector>
#include <set>
using namespace std;
const char iname[] = "ubuntzei.in";
const char oname[] = "ubuntzei.out";
const int inf = static_cast<unsigned int>(1 << 31) - 1;
ifstream f(iname);
ofstream g(oname);
void dijkstra(const int &source, const vector< vector< pair<int, int> > > &E, vector<int> &dis) {
dis.resize(E.size(), inf);
dis[source] = 0;
set< pair<int, int> > S;
S.insert(make_pair(0, source));
while (!S.empty()) {
int x = S.begin() -> second;
S.erase(S.begin());
for (vector< pair<int, int> >::const_iterator it = E[x].begin(); it != E[x].end(); ++it)
if (dis[x] + it -> second < dis[it -> first]) {
S.erase(make_pair(dis[it -> first], it -> first));
dis[it -> first] = dis[x] + it -> second;
S.insert(make_pair(dis[it -> first], it -> first));
}
}
}
int main() {
int N, M; f >> N >> M;
int K; f >> K;
vector<int> nodes;
for (int i = 0; i < K; ++i) {
int x; f >> x; --x;
nodes.push_back(x);
}
nodes.push_back(N - 1);
nodes.push_back(0);
K += 2;
vector< vector< pair<int, int> > >E(N);
for (int i = 0; i < M; ++i) {
int x, y, z; f >> x >> y >> z;
--x; --y;
E[x].push_back(make_pair(y, z));
E[y].push_back(make_pair(x, z));
}
vector< vector<int> > dist(K, vector<int>(K, 0));
for (int i = 0; i < K; ++i) {
vector<int> dis;
dijkstra(nodes[i], E, dis);
for (int j = 0; j < K; ++j)
dist[i][j] = dis[nodes[j]];
}
vector< vector<int> > dp(1 << (K - 1), vector<int>(K - 1, inf));
for (int i = 0; i < K - 1; ++i)
dp[1 << i][i] = dist[K - 1][i];
for (int i = 0; i < (1 << (K - 1)); ++i)
for (int j = 0; j < K - 1; ++j)
if (dp[i][j] != inf)
for (int k = 0; k < (K - 1); ++k)
if ((1 << k) & (~i))
dp[i | (1 << k)][k] = min(dp[i | (1 << k)][k], dp[i][j] + dist[j][k]);
g << dp[(1 << (K - 1)) - 1][K - 2] << "\n";
}