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规范c++代码#include <iostream> using namespace std; struct Edge { int to; int distance; }G[31][30];//用于构建图的邻接表 int GSize[31];//图中每个节点的度 double d[256][31];//记录 [已使用的车票的集合][当前节点] 的状态节点的最小距离 int main() { int n, m, p, a, b;//车票数 节点数 边数 起点 终点 int ticket[8];//每个车票的马匹数 int xi, yi, zi;//用于输入数据时的临时变量 int intans;//用于输出保留3位小数点的结果的变量 double ans;//用于记录最终答案的变量 while (true)//案例循环 { cin >> n >> m >> p >> a >> b; if (!n) { break; } //进行初始化 ans = 1 << 30;//先将答案初始化为较大的数 for (int i = 0; i <= m; i++) { for (int j = 0; j < (1 << n); j++) { d[j][i] = 1 << 30;//将每个节点的距离初始化为较大的数 } GSize[i] = 0; } //进行数据输入 for (int i = 0; i < n; i++) { cin >> ticket[i]; } for (int i = 0; i < p; i++) { cin >> xi >> yi >> zi; G[xi][GSize[xi]].to = yi; G[xi][GSize[xi]].distance = zi; GSize[xi]++; G[yi][GSize[yi]].to = xi; G[yi][GSize[yi]].distance = zi; GSize[yi]++; } d[0][a] = 0;//将 [已使用的车票的集合为空集][当前节点为起始节点] 的状态节点的距离设为 0 for (int U = 0; U < 1 << n; U++) { for (int i = 1; i <= m; i++) { for (int j = 0; j < GSize[i]; j++) { for (int k = 0; k < n; k++) { if (!((U >> k) & 1)) { if (d[U | (1 << k)][G[i][j].to] > d[U][i] + (double)G[i][j].distance / ticket[k]) { d[U | (1 << k)][G[i][j].to] = d[U][i] + (double)G[i][j].distance / ticket[k]; } } } } } } for (int i = 0; i < (1 << n); i++)//对每个 当前节点为终点 的状态节点进行检索 { if (d[i][b] < ans) { ans = d[i][b]; } } //输出结果 if (ans < (1 << 30)) { ans = ans * 1000 + 0.5; intans = (int)ans; cout << intans / 1000 << '.'; cout << (intans % 1000) / 100; cout << (intans % 100) / 10; cout << intans % 10 << '\n'; } else { cout << "Impossible\n"; } } return 0; } Followed by: Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator