随笔分类 - 图论—spfa
摘要:先跑spfa求出最短路构成的DAG,然后在DAG上跑出支配树dfs出size取max即可 关于支配树,因为是DAG,支配点就是入点在支配树上的lca,所以一边拓扑一边预处理倍增,然后用倍增求lca cpp include include include include include using n
阅读全文
摘要:容易看出是用质因数凑n 首先01个因数的情况可以特判,2个的情况就是ap1+bp2=n,b=n/p2(mod p1),这里的b是最小的特解,求出来看bp2 include include include using namespace std; const int N=200005,M=316000
阅读全文
摘要:你不该人前逞骄傲
不该词费又滔滔
阅读全文
摘要:見えない僕を信じてくれ
阅读全文
摘要:spfa预处理出最短路数组dis,然后反向建边bfs出ok[u]表示u能到n点 然后发现有0环的话时候有inf解的,先dfs找0环判断即可 然后dfs,设状态f[u][v]为到u点,还可以跑最短路+v的长度,记忆化,然后直接搜即可 cpp include include include includ
阅读全文
摘要:有趣啊 先spfa分别求出以s1,t1,s2,t2为起点的最短路,然后把在s1 t1或者s2 t2最短路上的边重新建有向图,跑拓扑最长路即可 cpp include include include include include using namespace std; const int N=15
阅读全文
摘要:调死我了…… 首先观察移动方式,需要移动的格子每次移动到相邻格子,一定是先把空白格子挪过去,所以我们得到一种做法,就是bfs预处理出每一个格子的四联通格子之间的空白格子移动距离建边,注意这个移动是不能经过当前枚举的中心格子的,然后把中心格子和它的四联通格子建边权为1的边 注意这里用来建边的点,是(x
阅读全文
摘要:设f[i]为杀死i的最小代价,显然\\( f[i]=min(k[i],s[i]+\sum f[to]) \\) 但是这个东西有后效性,所以我们使用spfa来做,具体就是每更新一个f[i],就把能被它更新的点重新入队 cpp include include include include using
阅读全文
摘要:显然是状压,显然不可能把所有格子压起来 仔细观察发现只有机关周围的四个格子有用以及起点,所以我们用spfa处理出这些格子两两之间的距离(注意细节……这里写挂了好几次),然后设f[s][i]为碰完的机关石状态为s,现在在有用格子的第i个的最小停下次数,转移按照套路即可 cpp include incl
阅读全文
摘要:枚举起点做spfa,然后一条边在最短路上的条件是dis[e[i].to]==dis[u]+e[i].va,所以每次spfa完之后,dfs出a[i]表示经过i点的最短路的起点数,b[i]表示经过i点的最短路的终点数,一条边(u,v)在当前起点下的答案就是a[u] b[v],最终答案是总和 因为最短路构
阅读全文
摘要:和bzoj同名题不一样! 起点和水点向花费一个荷花能到的第一个点连一条边权为1的有向边,然后跑计数spfa即可
阅读全文
摘要:设s为前缀和,首先显然的条件是$$ s_{bi} s_{ai 1} =c $$,然后隐含的是$$ s_i s_{i 1} =0 s_i s_{i 1} include include using namespace std; const int N=500005,inf=1e9; int n,s=i
阅读全文
摘要:~~为什么早年的题总是从0开始标号啊……又zz了一次WA~~ 分层图的题只有这一个套路吧,建分层图,然后优化时间是分层跑spfa然后层与层之间单独跑即可 cpp include include include include using namespace std; const int N=5000
阅读全文
摘要:死活想不到分层图emmm 基本想法是建立分层图,就是建k+1层原图,然后相邻两层之间把原图的边在上一层的起点与下一层的终点连起来,边权为val/2,表示免了这条边的边权,然后答案就是第0层的s到k层的t的最短路,因为0权边总是从上一层连到下一层,所以到达k层就表示走了k条0权边 然后仔细观察这张图的
阅读全文
摘要:想象成一层一层的染,所以相邻的两个格子连边,边权同色为0异色为1,然后答案就是某个格子到距离它最远得黑格子的最短距离的最小值 注意特判掉不需要染色的情况 cpp include include include include using namespace std; const int N=55,i
阅读全文
摘要:直接跑最短路就行了……还不用判负环 cpp include include include using namespace std; const int N=25005,inf=1e9; int n,r,p,s,h[N],cnt,dis[N]; bool v[N]; struct qwe { int
阅读全文

浙公网安备 33010602011771号