(サブ最適問題は、それが直接ダイクストラによって解決することができない、満たされていません)
詳細:ベクトル配列は、ああ、全体的に割り当てることができます!
フィル()関数の開始アドレスの二次元アレイのエッジ[0]の代わりにエッジの、ヘッダアルゴリズム
影響を受ける:偶数のCmax各自転車局の最大容量、自転車内部局の数が正確のCmax / 2あれば、完全な状態の中で述べています。ステーション容量が満杯または空である場合、(0の接合部で)制御センターは道に沿ってすべてのステーションは、完全に達しているので、持ち運びや駅に向かう途中で自転車の特定の数を収集します。Cmaxは次に、ステーション数n、問題局SP、M縁、並びに距離、最短経路が与えられます。最小エネルギー要件自転車部品の数を持つ複数の最短経路が存在する場合。あなたはまだ道路の異なる部分がたくさんある場合はバイクの数が最も少ないが、駅(調整していないバック)から持ち帰ったため、その後、見て〜
分析:ダイクストラ+ DFS。すべてのパスが決定された後にのみダイクストラができない場合は、パス上の転送minNeedとminBackが最適なサブ構造を満たしていないので、それはプロセスの単純合計ではありません、唯一の必要性やバック最小限の最小面積を選択〜
ダイクストラ最短経路、およびDFSはminNeed minBack経路を求めると、シミュレーションDFS処理が再度調整する必要がある場合、バック得られた必要性を決定し、minNeedとminBack比較をした後、状況に応じて経路を更新し、最終的な出力minNeedパスminBack出力、最初のノードからノードまでの最後のパスを覚えて後方へ〜
#include<stdio.h> #include<vector> #include<algorithm> #pragma warning(disable:4996) #define INF 0xfffffff using namespace std; int cmax, n, m, sp; int d[510], vis[510], bike[510]; int edge[510][510]; vector<int>res, tmp, pre[510]; int minback =INF, minsend=INF; void dfs(int v) { tmp.push_back(v); if (0 == v) { int back = 0, send = 0; for (int i = tmp.size() - 1; i >= 0; i--) { if (bike[tmp[i]] > 0) { back += bike[tmp[i]]; } else { if (back > (0 - bike[tmp[i]])) { back += bike[tmp[i]]; } else { send += (0 - bike[tmp[i]] - back); back = 0; } } } if (send < minsend) { minsend = send; minback = back; res = tmp; } else if (send == minsend && back < minback) { minback = back; res = tmp; } tmp.pop_back(); return; } for (int i = 0; i < pre[v].size(); i++) dfs(pre[v][i]); tmp.pop_back(); } int main() { fill(edge[0],edge[0]+510*510,INF); fill(d, d + 510, INF); scanf("%d%d%d%d",&cmax,&n,&sp,&m); for (int i = 1; i <= n; i++) { scanf("%d", &bike[i]), bike[i] -= cmax / 2; } for (int i = 1,a,b,c; i <= m; i++) { scanf("%d%d%d", &a, &b,&c); edge[a][b] = edge[b][a] = c; } d[0] = 0; for (int i = 0; i <= n; i++) { int u = -1, min = INF; for (int j = 0; j <= n; j++) { if (0 == vis[j] && d[j] < min) { u = j; min = d[j]; } } if (-1 == u) break; vis[u] = 1; for (int v = 0; v <= n; v++) { if (0 == vis[v] && edge[u][v] != INF) { if (d[v] > d[u] + edge[u][v]) { d[v] = d[u] + edge[u][v]; pre[v].clear(); pre[v].push_back(u); } else if (d[v] == d[u] + edge[u][v]) { pre[v].push_back(u); } } } } dfs(sp); printf("%d ",minsend); int i = res.size() - 1; for (; i > 0; i--){ printf("%d->", res[i]); } printf("%d ", res[i]); printf("%d", minback); getchar(); getchar(); return 0; }