| ||||||||||
| Online Judge | Problem Set | Authors | Online Contests | User | ||||||
|---|---|---|---|---|---|---|---|---|---|---|
| Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest | |||||||||
状压DP(代码)(输出要用%.3f)#include <iostream>
#include <cstdio>
#include <cstring>
#define N 9
#define M 31
using namespace std;
const double INF = 0x3f3f3f3f;
int n, m, p, a, b;
double dp[1 << N][M]; //dp[s][j] 达到j点以及剩余车票为s的状态的最小费用
int t[N];
inline double min(double x, double y) {
return x > y ? y : x;
}
int main () {
int u, v, cost;
double ans;
while(1) {
scanf("%d %d %d %d %d", &n, &m, &p, &a, &b);
if(n == 0 and m == 0 and p == 0 and a == 0 and b == 0) break;
int d[M][M] = {0};
ans = INF;
for(int i = 0; i < n; i++) scanf("%d", &t[i]);
for(int i = 0; i < p; i++) {
scanf("%d %d %d", &u, &v, &cost);
d[u][v] = d[v][u] = cost;
}
for(int i = 0; i < 1 << N; i++)
for(int j = 0; j < M; j++)
dp[i][j] = INF;
dp[0][a] = 0; //起点
for(int s = 0; s < 1 << n; s++) {
for(int q = 0; q < n; q++) {//枚举剩下车票
if(!(s >> q & 1)) //第q张车票没有用过
for(int i = 1; i <= m; i++) //从i转移到j,枚举起点
for(int j = 1; j <= m; j++) //枚举终点
if(d[i][j])
dp[s|(1 << q)][j] = min(dp[s|(1 << q)][j], dp[s][i] + (double)d[i][j] / t[q]);
}
ans = min(ans, dp[s][b]); //更新每个状态到达中的的费用
}
if(ans == INF) printf("Impossible\n");
else printf("%.3f\n", ans);
}
return 0;
}
Followed by: Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator