Pagini recente » Cod sursa (job #2281166) | Cod sursa (job #1755895) | Cod sursa (job #19825) | Cod sursa (job #257009) | Cod sursa (job #919709)
Cod sursa(job #919709)
#include <fstream>
#include <vector>
#include <queue>
#include <bitset>
#define MP make_pair
#define PB push_back
#define x first
#define y second
#define PII pair<int,int>
using namespace std;
ifstream fin("team.in");
ofstream fout("team.out");
const int INF = int(1e9);
int P , N , M , dest[52] , C[52][52] , cost[52][52][52] , D[502];
vector< PII > G[502];
bitset<502> use;
struct cmp{ bool operator() (const int &x,const int &y)
const {return D[x] > D[y];}
};
priority_queue<int,vector<int>,cmp> h;
void read_data()
{
freopen("team.in","r",stdin);
freopen("team.out","w",stdout);
scanf("%d %d %d",&P,&N,&M);
for(int x , y , c;M;M--)
{
scanf("%d %d %d",&x,&y,&c);
G[x].PB(MP(y,c));
G[y].PB(MP(x,c));
}
dest[0] = 1;
for(int i = 1;i <= P;++i)
scanf("%d",&dest[i]);
}
void djikstra(int S)
{
for(int i = 1;i <= N;++i) D[i] = INF , use[i] = 0;
for(h.push(S) , D[S] = 0 , use[S] = 1;!h.empty();)
{
int v = h.top(); h.pop(); use[v] = 0;
for(vector< PII >::const_iterator w = G[v].begin(); w != G[v].end();++w)
if(D[w->x] > D[v] + w->y)
{
D[w->x] = D[v] + w->y;
if(use[w->x] == 0) h.push(w->x) , use[w->x] = 1;
}
}
}
int memo(int i,int j,int k)
{
if(cost[i][j][k] != INF) return cost[i][j][k];
if(i > j) return 0;
for(int q = i; q <= j;++q)
cost[i][j][k] = min(cost[i][j][k],memo(i,q - 1,q) + memo(q + 1,j,q) + C[k][q]);
return cost[i][j][k];
}
int main()
{
read_data();
for(int i = 0;i <= P;++i)
for(int j = 0;j <= P;++j)
for(int k = 0;k <= P;++k)
cost[i][j][k] = INF;
for(int i = 0;i <= P;++i)
{
djikstra(dest[i]);
for(int j = 0; j <= P;++j)
C[i][j] = D[dest[j]];
}
printf("%d",memo(1,P,0));
return 0;
}