Pagini recente » Cod sursa (job #424350) | Cod sursa (job #29345) | Cod sursa (job #3156050) | Cod sursa (job #9204) | Cod sursa (job #38408)
Cod sursa(job #38408)
// O(p^4 + p * N^2)
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define INFTY 2000000001
#define NMax 512
#define PMax 53
typedef struct lista { int id, cost; struct lista *next; } lista;
typedef lista *Graf[NMax];
typedef long matrix[NMax][NMax];
int n, p;
Graf G;
int loc[PMax];
matrix nou, vechi;
int D[PMax][PMax][PMax];
int dist[PMax][NMax];
int Best;
void add_to_list(lista **l, int item, int cst)
{
lista *tmp = (lista *)malloc(sizeof(lista));
tmp->id = item;
tmp->cost = cst;
tmp->next = *l;
*l = tmp;
}
void djikstra(int ix, int sursa)
{
lista *f; int i, j, ind, uz[NMax], d[NMax];
memset(uz, 0, sizeof(uz));
for (i = 0; i <= n; i++) d[i] = 2000000001;
d[sursa] = 0;
for (i = 1; i < n; i++)
{
ind = 0;
for (j = 1; j <= n; j++)
if (d[j] < d[ind] && !uz[j])
ind = j;
uz[ind] = 1;
for (f = G[ind]; f; f = f->next)
if (d[f->id] > d[ind] + f->cost)
d[f->id] = d[ind] + f->cost;
}
for (i = 1; i <= n; i++)
dist[ix][i] = d[i];
}
void compute()
{
int d, i, j, k, t;
for (i = 0; i <= p; i++)
djikstra(i, loc[i]);
for (d = 1; d <= p; d++)
for (i = 1; i <= p-d+1; i++)
{
j = i+d-1;
for (k = 0; k <= p; k++)
{
D[k][i][j] = 2000000001;
for (t = i; t <= j; t++)
if (D[k][i][j] > D[t][i][t-1] + D[t][t+1][j] + dist[k][loc[t]])
D[k][i][j] = D[t][i][t-1] + D[t][t+1][j] + dist[k][loc[t]];
}
}
Best = D[0][1][p];
}
int main()
{
int i, m, x, y, c;
freopen("team.in", "r", stdin);
freopen("team.out", "w", stdout);
scanf("%d %d %d", &p, &n, &m);
for (x = 1; x <= n; x++)
for (y = 1; y <= n; y++)
vechi[x][y] = INFTY;
for (; m; m--)
{
scanf("%d %d %d", &x, &y, &c);
add_to_list(&G[x], y, c);
add_to_list(&G[y], x, c);
vechi[x][y] = vechi[y][x] = c;
}
for (i = 1; i <= p; i++)
scanf("%d", &loc[i]);
loc[0] = 1;
compute();
printf("%d\n", Best);
return 0;
}