Pagini recente » Cod sursa (job #1607921) | Cod sursa (job #2777688) | Cod sursa (job #1265621) | Cod sursa (job #3277249) | Cod sursa (job #1566853)
#include <iostream>
#include <fstream>
#include <vector>
#include <queue>
using namespace std;
ifstream fin("team.in");
ofstream fout("team.out");
#define INF 1000000000
#define MAX 510
#define MAXP 54
int C[MAX][MAX], valid[MAX], d[MAX], cat[MAX];
int rez[MAXP][MAXP][MAXP], viz[MAXP][MAXP][MAXP];
int rezultat(int st, int dr, int k)
{
if(st > dr)
return 0;
if(viz[st][dr][k])
return rez[st][dr][k];
viz[st][dr][k] = 1;
rez[st][dr][k] = INF;
for(int i = st ; i <= dr ; i++)
{
rez[st][dr][k] = min(rez[st][dr][k], rezultat(st, i - 1, d[i]) + rezultat(i + 1, dr, d[i]) + C[cat[k]][cat[d[i]]]);
}
return rez[st][dr][k];
}
int main()
{
int p, n, m, c, x, y, i, j, k, s;
fin >> p;
fin >> n;
fin >> m;
while(m--)
{
fin >> x >> y >> c;
C[x][y] = c + 1;
C[y][x] = c + 1;
}
for(i = 1 ; i <= n ; i++)
{
for(j = 1 ; j <= n ; j++)
{
if(C[i][j] == 0)
C[i][j] = INF;
else
C[i][j]--;
}
}
for(k = 1 ; k <= n ; k++)
{
for(i = 1 ; i <= n ; i++)
{
for(j = 1 ; j <= n ; j++)
{
C[i][j] = min(C[i][j], C[i][k] + C[k][j]);
}
}
}
for(i = 1 ; i <= n ; i++)
{
C[i][i] = 0;
}
for(i = 1 ; i <= p ; i++)
{
fin >> d[i];
valid[d[i]] = 1;
}
s = 0;
valid[1] = 1;
for(i = 1 ; i <= n ; i++)
{
if(valid[i])
{
valid[i] = ++s;
cat[s] = i;
}
}
for(i = 1 ; i <= p ; i++)
{
d[i] = valid[d[i]];
}
fout << rezultat(1, p, 1) << "\n";
}