【题目分析】
首先按照题目给出的样例想到只要每个物品的价格都用能够合成他的两个物品来更新,一边读入一边更新就好了,后来又发现如果出现这样的情况:1 2 3在2 5 6 的前面,那我们就需要先更新2在更新1.对吧就这样我就用了dfs然后完美爆栈75分,当然在这之前我还考虑到了如果一个物品可以被多个物品更新的话,那我们就是用边表记录下来,找每一组,但并没有实现(边表的孩子也是75hh),南城甚至建了棵树。但AC的同学是这么做(作)的,读入的时候更新一遍,读完了再倒回来更新一遍....为什么!!!(数据水)
#include <cstdio> #include <cstring> #include <iostream> using namespace std; #define ll long long const int maxn=20010; int n,m; ll c[maxn]; int a[maxn],x[maxn],y[maxn]; int pos; int f[maxn][5]; ll ans; ll search(int aa,int xx,int yy) { if(xx==0&&yy==0) return c[aa]; return min(c[aa],search(xx,f[xx][1],f[xx][2])+search(yy,f[yy][1],f[yy][2])); } int main() { freopen("dwarf.in","r",stdin); freopen("dwarf.out","w",stdout); scanf("%d%d",&n,&m); for(int i=1;i<=n;i++) scanf("%d",&c[i]); for(int i=1;i<=m;i++) { int a,x,y; scanf("%d%d%d",&a,&x,&y); f[a][1]=x;f[a][2]=y; } cout<<search(1,f[1][1],f[1][2]); fclose(stdin);fclose(stdout); return 0; }