Pagini recente » Cod sursa (job #115638) | Cod sursa (job #2232061) | Cod sursa (job #1089914) | Cod sursa (job #1480571) | Cod sursa (job #2982801)
#include <bits/stdc++.h>
using namespace std;
ifstream fin("ubuntzei.in");
ofstream fout("ubuntzei.out");
struct muchie {
int nod, cost;
bool operator < (const muchie &a) const {
return a.cost < cost;
}
};
int n, m, k;
int pitici[16];
int distante[18][18];
vector<pair<int, int>> adi[2001];
int dist[2001];
bool vizi[2001];
priority_queue<muchie> q;
int dp[16][(1 << 15)];
void dijkstra(int start, int pitic) {
muchie y;
for(int i = 1; i <= n; i++) {
dist[i] = INT_MAX;
vizi[i] = false;
}
while(!q.empty()) {
q.pop();
}
dist[start] = 0;
vizi[start] = true;
y.nod = start;
y.cost = 0;
q.push(y);
while(!q.empty()) {
int ncrt = q.top().nod;
vizi[ncrt] = true;
q.pop();
for(auto nou : adi[ncrt]) {
if(!vizi[nou.first] && dist[ncrt] + nou.second < dist[nou.first]) {
dist[nou.first] = dist[ncrt] + nou.second;
y.nod = nou.first;
y.cost = dist[nou.first];
q.push(y);
}
}
}
// cout << "Dupa dijkstra din " << start << " avem distantele: ";
// for(int i = 1; i <= n; i++) {
// cout << dist[i] << " ";
// }
// cout << "\n";
distante[pitic][k + 1] = dist[1]; //distanta pana la nodul 1
distante[pitic][k + 2] = dist[n]; // distanta pana la nodul n
for(int i = 1; i <= k; i++) {
distante[pitic][i] = dist[pitici[i]];
}
}
int main() {
fin >> n >> m >> k;
for(int i = 1; i <= k; i++) {
fin >> pitici[i];
}
int a, b, c;
for(int i = 1; i <= m; i++) {
fin >> a >> b >> c;
adi[a].push_back(make_pair(b, c));
adi[b].push_back(make_pair(a, c));
}
for(int i = 1; i <= k; i++) {
dijkstra(pitici[i], i);
}
dijkstra(1, k + 1);
dijkstra(n, k + 2);
// for(int i = 1; i <= k + 2; i++) {
// for(int j = 1; j <= k + 2; j++) {
// cout << distante[i][j] << " ";
// }
// cout << endl;
// }
for(int i = 1; i <= k; i++) {
for(int conf = 0; conf < (1 << k); conf++) {
dp[i][conf] = INT_MAX;
}
}
//incepem dp-ul
for(int i = 1; i <= k; i++) {
dp[i][(1 << (i - 1))] = distante[k + 1][i];
}
for(int conf = 1; conf < (1 << k); conf++) {
for(int sursa = 1; sursa <= k; sursa++) {
if((conf & (1 << (sursa - 1))) != 0) {
for(int nod = 1; nod <= k; nod++) {
if((conf & (1 << (nod - 1))) != 0 && nod != sursa) {
if(dp[nod][conf] > dp[sursa][conf ^ (1 << (sursa - 1))] + distante[nod][sursa]) {
dp[nod][conf] = dp[sursa][conf ^ (1 << (sursa - 1))] + distante[nod][sursa];
}
}
}
}
}
}
int rez = INT_MAX;
for(int i = 1; i <= k; i++) {
if(rez > dp[i][(1 << k) - 1] + distante[i][k + 2]) {
rez = dp[i][(1 << k) - 1] + distante[i][k + 2];
}
}
fout << rez;
return 0;
}