最短路总结
这一段时间复习了一下最短路,做了几道非常典型特别考察最短路性质的题 1.P1144 最短路计数 这个题主要考察对松弛操作的理解。 关键代码 if(dis[v] > dis[u] + 1) { dis[v] = dis[u] + 1; ans[v] = ans[u]; q.push(make_pair(dis[v],v)); } else if(dis[v] == dis[u] + 1) { ans[v] += ans[u]; ans[v] %= mo; } 2.CF786B Legacy 线段树优化建边,对于一个点,与一个连续区间里的点连边,可以利用线段树的特性来降低连边复杂度。 void build1(int &p,int l,int r) { if(l==r) { p=l;return; } p=++tot; int mid=l+r>>1; build1(lc[p],l,mid); build1(rc[p],mid+1,r); add(p,lc[p],0);add(p,rc[p],0); } 3.P1772 [ZJOI2006]物流运输 这是一道DP加最短路的题目,由于数据很小,我们的复杂度可以很高 设计这样的一个DP。f[i] 表示前i天的花费,考虑转移,考虑第j天是否改变航线 方程为:f[i] = min(f[i],f[j-1] + (i-j+1) * x + k);