您的位置:首页 > 其它

洛谷 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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: