
图论
zhouyuyang233
此乃ZJ之蒟蒻也
望大牛勿喷
我等蒟蒻感激不尽
展开
-
bzoj1880: [Sdoi2009]Elaxia的路线
传送门 大力做两遍最短路 然后判断一条便是否在两条最短路上 之后大力拓扑排序九可以了#include<iostream>#include<cstdio>#include<algorithm>#include<cstring>#include<cstdlib>#include<cmath>#include<queue>#define N 1505using namespace s原创 2017-07-08 21:50:35 · 249 阅读 · 0 评论 -
bzoj1509: [NOI2003]逃学的小孩
传送门 可以发现,min里头的两个东西具体取哪个并不重要。 下面给出一个结论:min(dis[A][C],dis[B][C])+dis[A][B]取最大值时,路径AB是整个树的直径(最长链)。 然后暴力求出树的直径就OK辣。#include<cstring> #include<cmath> #include<cstdio> #include<iostream> #includ原创 2017-05-03 20:55:03 · 346 阅读 · 0 评论 -
bzoj1487: [HNOI2009]无归岛
传送门 如果原图不是仙人掌,就是一个傻逼的树形dp 可是他就是仙人掌。 考虑破环为链。 强制断开一条边。在链上跑dp,在最后状态中求出合法的最大值就ok辣。#include<cmath>#include<cstdio>#include<cstring>#include<iostream>#include<algorithm>#define N 100005#define inf原创 2017-05-01 21:09:36 · 416 阅读 · 0 评论 -
bzoj1486: [HNOI2009]最小圈
传送门 显然是要二分答案的。 然后爆枚起点,用dfs版的spfa判负环就ok辣。#include<iostream>#include<cstdio>#include<cstring>#include<algorithm>#include<cstdlib>#include<cmath>#define N 3005#define ll long longusing namespace原创 2017-05-01 21:05:16 · 245 阅读 · 0 评论 -
bzoj1266: [AHOI2006]上学路线route
传送门 先跑一发最短路,求出有用边, 然后就是裸的网络流了。#include<cmath>#include<cstdio>#include<cstring>#include<iostream>#include<algorithm>#define inf 1e9#define ll long longusing namespace std;struct data{ int原创 2017-04-15 07:35:53 · 468 阅读 · 0 评论 -
bzoj1146: [CTSC2008]网络管理Network
传送门 树剖+线段树套平衡树 看到如此长的时限,我就放心大胆的开始(开车)了。 打代码真爽 具体实现: 1.二分答案, 2.在被轻重链剖分的树上跑线段树, 3.在每一个节点上维护平衡树用来查询区间排名。 复杂度分析: 1.二分一只log 2.树剖一只log 3.线段树一只log 4.平衡树一只log 然后就实现了Nlog^4N的做法。 四只log,四只log,跑得快,跑得原创 2017-04-05 20:32:07 · 429 阅读 · 0 评论 -
bzoj3196: Tyvj 1730 二逼平衡树
传送门 蛋疼树套树。 外层线段树维护区间。 内层treap维护数字出现情况。 打完这道我整个人都不好了。#include<cstdio>#include<cstdlib>#include<iostream>#include<cmath>#include<cstring>#include<algorithm>#define N 200005#define M 3000005#d原创 2017-04-05 11:13:10 · 252 阅读 · 0 评论 -
bzoj1295: [SCOI2009]最长距离
传送门 爆枚起点,跑一发最短路。求出距离不大于T的最远点对即可。const d:array [1..4,1..2] of longint=((1,0),(-1,0),(0,-1),(0,1));var a,e,f:array [0..51,0..51] of longint; b,c:array [0..1000005] of longint; ans,n,m,tt,i,j:long原创 2017-04-17 20:21:29 · 247 阅读 · 0 评论 -
bzoj1294: [SCOI2009]围豆豆Bean
传送门 从一点向随机方向引一条射线,如果射线和多边形的边相交奇数次,说明点在多边形内。否则在多边形外 据此我们可以搞D条射线出来,用来判断D个点当前是否已经被圈进来。 我们可以用一个二进制状态表示当前点是否被围。 然后就是喜闻乐见的状压bfs了。#include<cmath>#include<queue>#include<cstdio>#include<cstring>#includ原创 2017-04-17 20:18:34 · 676 阅读 · 0 评论 -
bzoj1003: [ZJOI2006]物流运输
传送门数据出奇的小,于是想到了暴力。F[i]表示前i天的最小话费得到转移方程式f[i]=sigma(f[j]+cost(j+1,i)*(i-j))(j其中cost(I,j)可以用spfa实现这样就可以ac了时间:O(N^2{dp}*kE{spfa})PS:这是为数不多的窝没看题解做出来的题/**************************************原创 2017-02-16 20:42:52 · 278 阅读 · 0 评论 -
bzoj1565: [NOI2009]植物大战僵尸
传送门 这道题吃到某个植物a可能需要先吃掉别的植物b(在他的右边或者保护着他),那么我们把a连向b。 发现这是最大权闭合子图。 显然是可以通过网络流水过的。 闭合子图: V中顶点的所有出边均指向V内部顶点 那么按照最大权闭合图的建图方法: 1.s向正权点连流量为权值的边 2.负权点向t连流量为权值的绝对值的边 3.有边相连的两点连流量为inf的边 答案就是正权点的权值总和减去最小原创 2017-05-05 15:55:39 · 318 阅读 · 0 评论 -
bzoj1098: [POI2007]办公楼biu
传送门 首先庆祝一下:我终于有自己的权限号辣!为了方便非权限号选手,今后决定在博客中放出题面共参考。 以上内容全是废话 原题就是求补图的连通块个数 不吐就是新建一张图,如果原图中两个点有边,则新图中没边。否则新图中右边。 机智的使用链表+bfs. 链表用来快速维护编号最小的没有被覆盖过的元素。 同时支持删点操作。#include<cmath>#include<cstdio>#inc原创 2017-05-06 21:39:52 · 293 阅读 · 0 评论 -
bzoj4878: [Lydsy2017年5月月赛]挑战NP-Hard
传送门 考试的时候完全想不出来。 考虑尝试对图进行贪心染色,col[x]=mex(col[y]),其中x与y有边,且y已被染过色 若max(col[i])<=k,那么k染色问题就解决了 否则随便选一个颜色是k+1的点,按照颜色递减走,一定可以走出一条边数为k的简单路径 因为如果一个点col是x,在x!=1是,必然有一个与其相邻的点y满足col[y]=x-1(否则这个点的col值就可以取到x原创 2017-05-06 21:47:36 · 683 阅读 · 0 评论 -
bzoj1797: [Ahoi2009]Mincut 最小割
传送门 显然先跑一遍网络流。 在残余网络上跑tarjan求出所有SCC, 记id[u]为点u所在SCC的编号。显然有id[s]!=id[t] ①对于任意一条满流边(u,v),(u,v)能够出现在某个最小割集中,当且仅当id[u]!=id[v]; ②对于任意一条满流边(u,v),(u,v)必定出现在最小割集中,当且仅当id[u]==id[s]且id[v]==id[t]。①<==将每个SCC缩原创 2017-06-12 21:18:11 · 234 阅读 · 0 评论 -
bzoj1924: [Sdoi2010]所驼门王的宝藏
传送门 我们首先可以用O(NlogN)的时间建出来所有的边。 然后我们大力tarjan求联通块 之后大力拓扑排序一发就可以了。#include<cstdio> #include<iostream>#include<cstdlib>#include<cmath>#include<cstring>#include<algorithm>#include<vector>#include<原创 2017-07-12 21:50:25 · 478 阅读 · 0 评论 -
bzoj1922: [Sdoi2010]大陆争霸
传送门 我们假设d1[i]表示机器人到达i的最短时间 d2[i]为结界消失的最短时间 则一个点可以被访问到的最短时间为max(d1[i],d2[i]) 我们跑一遍最短路 等到该节点满足条件就向外扩展#include<iostream>#include<cstdio>#include<cstring>#include<algorithm>#include<cstdlib>#incl原创 2017-07-12 21:40:23 · 273 阅读 · 0 评论 -
bzoj1787: [Ahoi2008]Meet 紧急集合&&bzoj1832: [AHOI2008]聚会
传送门 三个节点两两做LCA。 除了两个相同的那另外一个就是答案。 为什么?显然成立呀。 不懂自己画画图。#include<cmath>#include<cstdio>#include<cstring>#include<iostream>#include<algorithm>#define N 500005using namespace std;struct edge{int原创 2017-06-09 21:11:48 · 301 阅读 · 0 评论 -
bzoj1912: [Apio2010]patrol 巡逻
传送门 k=0显然每条边都要走两次,答案=(n-1)*2 k=1我们找到树上最长链,在两段连边 在环上的就不用再走一遍了 答案=(n-1)-链长+1 k=2在k=1的基础上将那些边编圈变为-1,再跑最长链 不再环上显然只要一遍 但是在两个环上要走两遍。 答案=(n-1)-链长1+1-链长2+1#include<iostream>#incl原创 2017-07-11 21:54:14 · 269 阅读 · 0 评论 -
bzoj1823: [JSOI2010]满汉全席
传送门 2-SAT的裸题。 没学过的推荐一篇文章#include<cstdio> #include<iostream>#include<cstdlib>#include<cmath>#include<cstring>#include<algorithm>using namespace std;struct edge{int to,next;}e[2005];int head[20原创 2017-06-21 21:27:23 · 320 阅读 · 0 评论 -
bzoj1517: [POI2006]Met
传送门 首先堆原图进行拓扑排序。 给出个结论: 对于每一层来说,对答案的贡献是min(2*l,num[dep]) num[dep]代表第dep层的节点个数。 求和即可。 方案显然是最优的。 可行性自己yy#include<cmath>#include<cstdio>#include<cstdlib>#include<cstring>#include<iostream>原创 2017-06-01 19:00:25 · 351 阅读 · 0 评论 -
bzoj1512: [POI2006]Pro-Professor Szu
传送门 首先将便反向,这样就变成了从主楼到其他楼的路径数 然后我们大力tarjan求强连通分量。 发现一个强连通分量内又多于2个点显然是GG的。 其他随便拓扑排序就可以了。#include<cmath>#include<cstdio>#include<vector>#include<cstring>#include<cstdlib>#include<iostream>#inclu原创 2017-06-01 18:43:06 · 642 阅读 · 0 评论 -
bzoj1759: Let there be rainbows!
传送门 显然这道题是可以用树剖水过去的。#include<cmath>#include<cstdio>#include<cstdlib>#include<cstring>#include<iostream>#include<algorithm>#define N 200005using namespace std;struct edge{int to,next;}e[N*2];i原创 2017-06-05 20:51:54 · 242 阅读 · 0 评论 -
bzoj1001: [BeiJing2006]狼抓兔子
1001: [BeiJing2006]狼抓兔子Time Limit: 15 Sec MemoryLimit: 162 MBDescription现在小朋友们最喜欢的"喜羊羊与灰太狼",话说灰太狼抓羊不到,但抓兔子还是比较在行的,而且现在的兔子还比较笨,它们只有两个窝,现在你做为狼王,面对下面这样一个网格的地形: 左上角点为(1,1),右下角点为(N,M)(上图中N=4原创 2017-02-15 21:33:35 · 1477 阅读 · 1 评论 -
bzoj1197: [HNOI2006]花仙子的魔法
传送门 题目废话太多。 就是n个球最多能把空间划分成多少个部分。 尝试下n = 3的情况想象下……再看下面的内容……对n维区域用m个求划分,答案记为f(n, m)对于第m个球,那么最优情况是它与所有球相交(显然成立) 然后相交时球是n维的,球面是n-1维的,球面与球面的交集是n - 2维的 (自己脑洞N=3的情况) 其它球面来划分这个球面,相当于把n - 1维区域用m - 1个n - 2原创 2017-04-04 12:02:46 · 501 阅读 · 0 评论 -
bzoj1060: [ZJOI2007]时态同步
传送门 hzw说是树形dp 扯淡 直接贪心。 用f[x]表示以x为根的子树内,离x最远的点的距离。 显然有f[x]=max(f[son]+dist[x][son]) 按照贪心思想,在x与儿子之间放延迟器最好。 所以答案=sigma(f[x]-f[son]-dis[x][son])#include<cmath>#include<cstdio>#include<cstring>#in原创 2017-03-13 15:34:18 · 349 阅读 · 1 评论 -
bzoj1059: [ZJOI2007]矩阵游戏
传送门 同行的点经过变换之后仍然同行 同列的点经过变换之后仍然同列(以上结论自己yy) 于是问题转化为求不同行且不同列的n个点。 用二分图匹配水过。#include<cstring> #include<cmath> #include<cstdio> #include<iostream> #include<cstdlib> #include<algorithm>usi原创 2017-03-13 15:28:40 · 256 阅读 · 0 评论 -
bzoj1054: [HAOI2008]移动玩具
传送门 状态数小于2^16,考虑状压。 然后枚举出发点与到达点,spfa水过。 时间:2^16(状态)*16点数*4方案数。var pow:array [0..20] of longint; vi,q:array [0..100005] of longint; st,en,i,h,t,x:longint; ch:char;begin st:=0; pow[1]:=1;原创 2017-03-09 15:58:03 · 383 阅读 · 0 评论 -
bzoj1051: [HAOI2006]受欢迎的牛
传送门 tarjan大法好。 先用tarjan对原图缩点,再在新图上跑一边拓扑排序就行了。 新图上记忆化搜索也行。原创 2017-03-08 21:29:49 · 369 阅读 · 0 评论 -
bzoj1050: [HAOI2006]旅行comf
传送门 spfa有反例(自己yy) 我们可以暴力枚举最短边,然后做kruscal。 这样时间复杂度是O(M^2)的#include<cstdio>#include<cmath>#include<ctime>#include<cstring>#include<iostream>#include<algorithm>using namespace std;struct node{原创 2017-03-08 15:50:04 · 301 阅读 · 0 评论 -
bzoj1017: [JSOI2008]魔兽地图
传送门一个超级奇怪的树形dp。因为儿子管父亲。思路是显然的:f[i][j][k],表示第I个物品,用于合成(上缴)的有J个,花费K的代价能获得的最大价值。我们还可以求出物品的获得上限(没钱or没子物品)接下来就是一个背包了。最外层枚举当前物品取几个里面枚举儿子,用M^2时间可以跑出背包。辅助数组G[i][j]前i个儿子花费j的代价能得到的最优值然后枚举私吞的个数。原创 2017-02-23 11:58:58 · 414 阅读 · 0 评论 -
bzoj1036: [ZJOI2008]树的统计Count
传送门啊,树剖。本人第一道树剖。其实就是树链剖分后跑线段树。时间O(nlogn^2)#include#include#include#include#include#include#define N 30005using namespace std;struct edge{int to,next;}e[N*2];struct node{int l,r,ma,s原创 2017-03-03 08:48:27 · 178 阅读 · 0 评论 -
1016: [JSOI2008]最小生成树计数
传送门并查集好题。用暴力求出最小生成树,确定每一种长度的边在图中的数量。又Kruscal算法流程知,每一种长度的边在图中的数量一定(否则存在更优解)对于每一个长度的边,爆搜求出方案个数。运用乘法原理求解即可。P.S:本题并查集无需路径压缩。/**************************************************************原创 2017-02-22 20:24:46 · 343 阅读 · 0 评论 -
bzoj1015: [JSOI2008]星球大战
传送门并查集裸题。按照星球毁灭顺序从后向前插点,并向可行点连边。插入一个点联通块+1;连接一条边联通块-1。PS刷水题有益于健康/************************************************************** Problem: 1015 User: zhouyuyang Language: Pascal原创 2017-02-22 20:22:14 · 364 阅读 · 0 评论 -
bzoj1061: [Noi2008]志愿者招募
传送门 思路:例如一共需要4天,四天需要的人数依次是4,2,5,3。有5类志愿者,如下表所示: 设雇佣第i类志愿者的人数为X[i],每个志愿者的费用为V[i],第j天雇佣的人数为P[j],则每天的雇佣人数应满足一个不等式,如上表所述,可以列出P[1]=X[1]+X[2]>=4P[2]=X[1]+X[3]>=2P[3]=X[3]+X[4]+X[5]>=5P[4]=X[5]>=3对于第i个不等式,添原创 2017-03-13 15:52:06 · 379 阅读 · 0 评论 -
bzoj1211: [HNOI2004]树的计数
传送门 Prufer序列,具体参考[HNOI2008]明明的烦恼 直接乘会爆long long,所以先把每个数分解质因数,把质因数的次数相加相减,然后再乘起来 注意此题无解需要输出0 当n!=1&&d[i]==0时 输出0 当Σ(d[i]-1)!=n-2时输出0#include<iostream>#include<cmath>#include<cstdio>#include<cstd原创 2017-04-08 15:52:02 · 338 阅读 · 0 评论 -
bzoj1212: [HNOI2004]L语言
传送门 对于被匹配的串暴力建立trie 然后直接每个位置往下匹配就行了。#include<cstring>#include<cmath> #include<cstdio> #include<iostream> #include<cstdlib> #include<algorithm>using namespace std;char s[15],str[1050005];原创 2017-04-08 15:54:04 · 712 阅读 · 0 评论 -
bzoj1196: [HNOI2006]公路修建问题
传送门 二分答案。 显然我们应该尽可能的选择能选的一级公路。 如果不能选再选二级公路。 判断方案是否可行即可。var a,b,c,d,f:array [0..30005] of longint; n,m,k,i,l,r,mi:longint;function get(x:longint):longint; begin if f[x]=x then exit(x);原创 2017-04-04 11:45:28 · 705 阅读 · 0 评论 -
bzoj1191: [HNOI2006]超级英雄Hero
传送门 二分图匹配裸题。#include<cmath>#include<cstdio>#include<cstdlib>#include<cstring>#include<algorithm>#include<iostream> #define ll long longusing namespace std;int n,m,x,y,ans;int a[1005][1005],b[原创 2017-04-02 20:38:00 · 280 阅读 · 0 评论 -
bzoj1189: [HNOI2007]紧急疏散evacuate
传送门 对于每个门进行一次bfs,得出每个点到每个门的时间 然后二分时间,每次建图dinic S到空地连一条容量1的边,每个空地到可到达的门连一条容量1的边,每个门到T连一条容量为时间的边。 网络流水过。#include<cstdio>#include<cmath>#include<ctime>#include<cstring>#include<iostream>#include<原创 2017-04-02 15:53:30 · 409 阅读 · 0 评论 -
bzoj1149: [CTSC2007]风玲Mobiles
传送门 脑残模拟题。 如果叶节点深度之差>1无解。 暴力判断两种深度的节点是否存在。 如果左右子树都有不合法。 暴力判断是否要交换即可。#include<cstdio>#include<cmath>#include<ctime>#include<cstring>#include<iostream>#include<algorithm>using namespace std;i原创 2017-04-02 15:50:01 · 711 阅读 · 0 评论