Pagini recente » Cod sursa (job #2572737) | Cod sursa (job #826111) | Cod sursa (job #2459483) | Cod sursa (job #2717509) | Cod sursa (job #731959)
Cod sursa(job #731959)
#include<cstdio>
#include<cstring>
#include<algorithm>
const int inf = 1000 * 1000 * 1000;
using namespace std;
const int maxn = 505;
const int maxp = 55;
int i , j , n , m , p , a , b , c , d[maxn][maxn] , dp[maxn][maxp][maxp], dest[maxn] , k;
bool calc[maxn][maxp][maxp];
int ret(int nod, int left, int right) {
int i , l , r;
if(calc[nod][left][right])
return dp[nod][left][right];
bool mark[maxp];
memset(mark , 0 , sizeof(mark));
bool ok = false;
for(i = left; i <= right; ++i)
if(dest[i] == nod) {
ok = true;
mark[i] = true;
}
if(ok) {
int ans = 0;
for(i = left; i <= right; ++i) {
if(!mark[i] && (mark[i - 1] || (i - 1) == left - 1))
l = i;
if(!mark[i] && (mark[i + 1] || (i + 1) == right + 1)) {
r = i;
ans += ret(nod , l , r);
}
}
calc[nod][left][right] = true;
dp[nod][left][right] = ans;
return ans;
}
printf("%d %d %d\n",nod,left,right);
int ans = inf;
for(i = left; i <= right; ++i)
ans = min(ans, ret(dest[i], left , right) + d[nod][dest[i]]);
calc[nod][left][right] = true;
dp[nod][left][right] = ans;
return ans;
}
int main()
{
freopen("team.in","r",stdin);
freopen("team.out","w",stdout);
scanf("%d\n%d\n%d",&p,&n,&m);
for(i = 1; i <= n; ++i)
for(j = 1; j <= n; ++j)
d[i][j] = inf;
for(i = 1; i <= m; ++i) {
scanf("%d %d %d",&a,&b,&c);
d[a][b] = d[b][a] = c;
}
for(k = 1; k <= n; ++k)
for(i = 1; i <= n; ++i)
for(j = 1 ; j <= n ; ++j)
if(i != j)
d[i][j] = min(d[i][k] + d[k][j], d[i][j]);
for(i = 1; i <= p; ++i)
scanf("%d",&dest[i]);
printf("%d\n",ret(1 , 1 , p));
return 0;
}