机房测试:lunch(贪心+最短路)
题目: 分析: 由数据3得:既然所有人都要学会,肯定是越早学越优。( 贪心 重要思路) 所以转移就是: dis[v]=max( dis[u] ,L ) ,u学会之后传授给v的条件是:u先学会,传授的时间在吃饭的时间内 在最短路上转移即可 再考虑有人必须学不会的限制。 如果有一个人u没有学会,就会给他周围的人v一个限制:v不能太早学会,否则吃饭的时候v就会传授给u 所以将lim[v]定为L+1,即他们在L的时候吃饭,L+1的时候v才学会,不会传给u 先将这种传递关系用spfa预处理 再跑一边dij求出每个人最早在多久学会。(将u、v之间的连边关系视作u学会了传授给v来更新v) 转移的时候是这样转移的: dis[v]=max( L,max( dis[u],lim[v] ) ) 原因: L指在这个区间内 ,dis指 u要先学会 , lim v 指在v学会的范畴内(防止出现v太早学会而将算法传给后面的人 这就是lim的作用) #include<bits/stdc++.h> using namespace std; #define N 200005 #define ri register int #define inf 1000000007//一定要足够大 否则会错!! int tot=0,to[N<<1],head[N],nex[N<<1],l[N<<1],r[N<<1],dis[N]