Pagini recente » Cod sursa (job #18094) | Cod sursa (job #18987) | Cod sursa (job #395647) | Cod sursa (job #2735592) | Cod sursa (job #422394)
Cod sursa(job #422394)
#include <stdio.h>
#include <algorithm>
#include <vector>
#include <queue>
#define INF 0x3f3f3f3f
#define MAXN 610
#define MAXP 61
using namespace std;
vector <pair<int, int> > G[MAXN];
int A[MAXN][MAXN];
int dest[MAXP];
int drum[MAXP][MAXP];
int Dij[MAXN];
bool ok[MAXN];
int d[MAXP][MAXP][MAXP];
int i,n,m,p,j,k,x,y,c;
queue<int> Q;
inline void BellmanFord(int nod)
{
int i;
for (i=1; i<=n; i++)
Dij[i] = INF;
Dij[nod] = 0;
memset(ok,false,sizeof(ok));
ok[nod] = true;
Q.push(nod);
while (!Q.empty()){
nod = Q.front();
Q.pop();
ok[nod] = false;
vector<pair<int, int> >::iterator it;
for (it = G[nod].begin(); it!=G[nod].end(); ++it)
if (Dij[it->first] > Dij[nod] + it->second){
Dij[it->first] = Dij[nod] + it->second;
if (!ok[it->first]){
ok[it->first] = true;
Q.push(it->first);
}
}
}
}
inline int calcul(int x, int y, int source)
{
if (x>y) return 0;
if (d[x][y][source]<INF) return d[x][y][source];
int aux;
d[x][y][source] = INF;
for (aux=x; aux<=y; aux++)
d[x][y][source] = min(d[x][y][source], calcul(x,aux-1,aux)+calcul(aux+1,y,aux)+drum[source][aux]);
return d[x][y][source];
}
int main()
{
freopen("team.in","r",stdin);
freopen("team.out","w",stdout);
scanf("%d",&p);
scanf("%d",&n);
scanf("%d",&m);
for (i=1; i<=n; i++)
for (j=1; j<=n; j++)
A[i][j] = INF;
for (i=1; i<=m; i++){
scanf("%d %d %d",&x,&y,&c);
A[x][y] = A[y][x] = c;
G[x].push_back(make_pair(y,c));
G[y].push_back(make_pair(x,c));
}
for (i=1; i<=p; i++)
scanf("%d",&dest[i]);
dest[0] = 1;
for (i=0; i<=p; i++){
BellmanFord(dest[i]);
for (j=0; j<=p; j++)
drum[i][j] = Dij[dest[j]];
}
memset(d,INF,sizeof(d));
printf("%d\n",calcul(1,p,0));
return 0;
}