Pagini recente » Cod sursa (job #672903) | Cod sursa (job #2706999) | Cod sursa (job #3231461) | Cod sursa (job #2366254) | Cod sursa (job #779763)
Cod sursa(job #779763)
#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];
}
char aa[100];
int pp;
inline int termen() {
int rez = 0;
while(aa[pp] >= '0' && aa[pp] <= '9')
rez = rez * 10 + aa[pp++] - '0';
++pp;
return rez;
}
int main() {
int i, a, b, c;
in >> p >> n >> m;
in.get();
for(i = 1; i<=m; ++i) {
in.getline(aa, 100);
pp = 0;
a = termen(); b = termen(); c = termen();
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";
}