洛谷 1875 佳佳的魔法药水
2017-08-17 16:16
260 查看
//此题像游戏里的装备合成树。类似于树形结构,但又存在环。所以不能用树形DP,考虑贪心的思想,每次用一个当前最小代价得到药水(一定是当前最优价格)+已经确定药水价格的药水来合成另一个药水,更新他的价格,这就是Dijkstra的思想。 #include<bits/stdc++.h> using namespace std; const int inf = 0x3f3f3f3f; const int maxn = 1010; int n, p[maxn], merg[maxn][maxn], ans[maxn]; bool v[maxn]; inline void Dijkstra(){ for(int i = 1, now; i < n; i++){ int low = inf; for(int j = 1; j <= n; j++) if(!v[j] && p[j] < low){ now = j; low = p[j]; } v[now] = 1; for(int j = 1; j <= n; j++) if(v[j] && merg[now][j]){ if(p[now] + p[j] < p[merg[now][j]]){ p[merg[now][j]] = p[now] + p[j]; ans[merg[now][j]] = ans[now] * ans[j]; } else if(p[now] + p[j] == p[merg[now][j]]) ans[merg[now][j]] += ans[now] * ans[j]; } } } int main(){ scanf("%d", &n); for(int i = 1; i <= n; i++){ scanf("%d", &p[i]); ans[i] = 1; } int x, y, z; while(scanf("%d%d%d", &x, &y, &z) != EOF) merg[x+1][y+1] = merg[y+1][x+1] = z+1; Dijkstra(); printf("%d %d\n", p[1], ans[1]); return 0; }
相关文章推荐
- 洛谷 P1875 佳佳的魔法药水
- 洛谷—— P1875 佳佳的魔法药水
- 洛谷 P1875 佳佳的魔法药水
- 洛谷 P1875 佳佳的魔法药水
- NDK 1408 佳佳的魔法药水(Magic Syrup)
- vijosP1285 佳佳的魔法药水
- P1875 佳佳的魔法药水
- 佳佳的魔法药水(好题,不过很神)
- [NDK 佳佳的魔法药水]
- 【vijos】【树形dp】佳佳的魔法药水
- 【Vijos-P1285】佳佳的魔法药水-Dijkstra思想
- vijos:P1285佳佳的魔法药水
- 佳佳的魔法药水
- P1875 佳佳的魔法药水
- 佳佳的魔法药水 (vijos 1285)
- 佳佳的魔法药水
- vijosP1285 佳佳的魔法药水
- 洛谷1583 佳佳的魔法照片
- hdu 1875 畅通工程再续
- 动态规划 洛谷P1868 饥饿的奶牛