//此题像游戏里的装备合成树。类似于树形结构,但又存在环。所以不能用树形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;
}
洛谷 1875 佳佳的魔法药水
最新推荐文章于 2022-01-19 21:29:35 发布