Pagini recente » Cod sursa (job #29674) | Cod sursa (job #19587) | Cod sursa (job #1755904) | Cod sursa (job #100763) | Cod sursa (job #764031)
Cod sursa(job #764031)
#include<fstream>
#include<vector>
#include<queue>
using namespace std;
ifstream in("team.in");
ofstream out("team.out");
const int N = 510;
const int P = 52;
const int inf = 1000000000;
int p, n, m, dist[P][N], dest[P], d[P][P][P];
vector<pair<int, int> > v[N];
void calc(const int &nr, const int &nod) {
queue<int> q;
bool ver[N];
q.push(nod);
int d[N];
for(int i = 1; i<=n; ++i)
d[i] = inf, ver[i] = false;
d[nod] = 0; ver[nod] = true;
while(!q.empty()) {
int el = q.front();
q.pop();
for(vector<pair<int, int> >::iterator it = v[el].begin(); it!=v[el].end(); ++it)
if(d[it->first] > d[el] + it->second) {
d[it->first] = d[el] + it->second;
if(!ver[it->first]){
q.push(it->first);
ver[it->first] = true;
}
}
ver[el] = false;
}
for(int i = 1; i<=n; ++i)
dist[nr][i] = d[i];
}
int din(const int &i, const int &j, const int &k) {
if(d[i][j][k] || i>j)
return d[i][j][k];
d[i][j][k] = inf;
for(int l = i; l <= j; ++l) {
d[i][j][k] = min(d[i][j][k], din(i, l - 1, l) + din(l + 1, j, l) + dist[l][dest[k]]);
if(!d[i][j][k])
break;
}
return d[i][j][k];
}
int main() {
int i, a, b, c;
in >> p >> n >> m;
for(i = 1; i<=m; ++i) {
in >> a >> b >> c;
v[a].push_back(pair<int, int>(b, c));
v[b].push_back(pair<int, int>(a, c));
}
for(i = 1; i<=p; ++i) {
in >> dest[i];
calc(i, dest[i]);
}
dest[0] = 1;
out << din(1, p, 0) << "\n";
}