用c啊哈编程我有兑换码计算78.5元可兑换多少美元?


注意到m最多为n+100最小为n
我们先在m条邊中取出n-1条让它组成一棵树。(用并查集去除多余的边但是这些多余的边不能删掉要记录下来);
对于每一个询问x,y;先求出它们的最近公共祖先z;然后设某个节点x的深度为dep[x]
但是这只是在去掉了多余的边后的情况。
我们还要把那些边再加进来
从加进来的多余的边的端点开始进行spfa。
这里的dis第一维只要开到200多就可以了
相当于我们在一棵树上进行了一次最短路。
然后再用多余的边上的点作为起点进行最短路
如果那些多余边上的点是最短路上的点。那么在第二次更新dis[s][x]+dis[s][y]的时候都会涉及到
可以理解为x->y经过了s这个点的最短路。枚举s取最小。
添加了边朂短路发生改变。那么新的最短路肯定经过某一条新添加的边的两端点
最后是LCA的实现思路:
第一份用的是RMQ预处理出LCA的方法。可以AC;
第二份用嘚是树上倍增的方法但是TLE。(供学习);


 
 

 
 


注意到m最多为n+100最小为n
我们先在m条邊中取出n-1条让它组成一棵树。(用并查集去除多余的边但是这些多余的边不能删掉要记录下来);
对于每一个询问x,y;先求出它们的最近公共祖先z;然后设某个节点x的深度为dep[x]
但是这只是在去掉了多余的边后的情况。
我们还要把那些边再加进来
从加进来的多余的边的端点开始进行spfa。
这里的dis第一维只要开到200多就可以了
相当于我们在一棵树上进行了一次最短路。
然后再用多余的边上的点作为起点进行最短路
如果那些多余边上的点是最短路上的点。那么在第二次更新dis[s][x]+dis[s][y]的时候都会涉及到
可以理解为x->y经过了s这个点的最短路。枚举s取最小。
添加了边朂短路发生改变。那么新的最短路肯定经过某一条新添加的边的两端点
最后是LCA的实现思路:
第一份用的是RMQ预处理出LCA的方法。可以AC;
第二份用嘚是树上倍增的方法但是TLE。(供学习);


 
 

 
 

我要回帖

更多关于 啊哈编程我有兑换码 的文章

 

随机推荐