题意:
构造一幅图 使题中给出的程序按该图执行 最终变量doge大于输入的C跳出
思路:
出题人思维简直神了! 实在是膜拜! 借题解的图:
按照图中所画 可以继续向右延伸
为何这样可以?? 为何边权要这么取??
先回答第二个问题:
取负数是为了可以不断的去更新 例如如果走了上面的-4那条边 那么它右边的所有点就又可以再更新一次 这样使更新达到了指数级别 (其实可以把所有的值加上一个值K 不过这个K一定要取好!)
除了负数外我们发现数字都是2的几次幂 如果我们按2进制来考虑的话 目的就是防止了进位对数字的干扰 这就是保证了如果走了-8那条边 那么他右边所有点都一定会更新 (简单说因为不可能比-8还小 为啥 因为没进位啊!) 这就是我为什么说取K值一定要取好 (这点我不确定 因为可能稍微改了一点点由于数字积累都会产生影响结果的进位 不过+-1可以过 但是1000就WA了… 求大神给证明!!!)
回答完第二个问题第一个问题也没什么可说的了 就是因为边权构造的好 使得一个点在被上面的边更新后 右边的点全要更新
代码:
#include<cstdio> int main() { int i,j; int f[33]={-1}; for(i=1;i<=30;i++) f[i]=f[i-1]*2; while(~scanf("%d",&i)) { puts("99 87"); for(i=1;i<30;i++) { printf("%d %d 0\n",i,i+30); printf("%d %d %d\n",i,i+1,f[29-i]); printf("%d %d %d\n",i+30,i+1,f[30-i]); } } return 0; }
HDU 4889 Scary Path Finding Algorithm,布布扣,bubuko.com
HDU 4889 Scary Path Finding Algorithm
原文地址:http://blog.csdn.net/houserabbit/article/details/38306447