Pagini recente » Cod sursa (job #2841754) | Cod sursa (job #2292563) | Cod sursa (job #99271) | Cod sursa (job #1964853) | Cod sursa (job #1369008)
#include <cstdio>
#include <cstring>
#include <queue>
#include <vector>
#include <cmath>
#define inf 500003
using namespace std;
int n, m, p, c[51], dmin[501], cost;
vector<int> g[501], gc[501];
class ComparVf
{public:
bool operator () (const int& a, const int& b)
{
return dmin[a]>dmin[b];
}
};
priority_queue<int, vector<int>, ComparVf> h;
void djk(int i)
{
int j, vf;
for(j=1; j<=n; ++j)dmin[j]=inf;
dmin[i]=0;
h.push(i);
while(!h.empty()){
vf=h.top();h.pop();
for(j=0; j<g[vf].size(); ++j)
if(dmin[g[vf][j]]>dmin[vf]+gc[vf][j]){
dmin[g[vf][j]]=dmin[vf]+gc[vf][j];
h.push(g[vf][j]);
}
}
}
void divide(int s, int d, int pc)
{
djk(pc);
int i, j, mn=inf;
if(s==d){
cost+=dmin[c[s]];
}
else{
for(i=s; i<=d; ++i)if(dmin[c[i]]<mn){
mn=dmin[c[i]];
j=i;
}
cost+=dmin[c[j]];
if(j>s)divide(s, j-1, c[j]);
if(j<d)divide(j+1, d, c[j]);
}
}
int main()
{
freopen("team.in", "r", stdin);
freopen("team.out", "w", stdout);
scanf("%d%d%d",&p, &n, &m);
int i, j, k, l;
for(i=1; i<=m; ++i){
scanf("%d%d%d", &j, &k, &l);
g[j].push_back(k);
gc[j].push_back(l);
g[k].push_back(j);
gc[k].push_back(l);
}
for(i=1; i<=p; ++i)scanf("%d", &c[i]);
divide(1, p, 1);
printf("%d", cost);
return 0;
}