图论
outer_form
OI/ACM
展开
-
【图论】[ZOJ1002]Fire Net
题目 二分图匹配,建图方式巧妙,横向连通块(在一行,中间没有障碍物)、纵向连通块分别为x,y部,相交的连边,求最大匹配。#include<cstdio>#include<cstring>#define MAXN 4int n,a[MAXN+10][MAXN+10],cnt,cnt1,c[MAXN*MAXN*2+10],ans;char s[MAXN+2][MAXN+2];bool vis原创 2015-08-26 20:15:11 · 464 阅读 · 0 评论 -
【树DP】【基环树】[ZJOI2008][HYSBZ/BZOJ1040]骑士
题目链接分析看穿题目如果一个骑士痛恨另一个骑士,就在两个骑士直接连接一条无向边。题目就是要求图中的最大权值独立集。实现方法如果这道题的图是一棵树(或森林)的话,显然可以用树形动态规划解决。 令f(u)f(u)表示以u为根的子树中的最大权值的独立集,令s(u)=∑v是u的儿子vf(v)s(u)=\sum_v^{v是u的儿子} f(v),gs(u)=∑v是u的孙子vf(v)gs(u)=\sum_v^{原创 2016-02-05 18:00:29 · 871 阅读 · 0 评论 -
【高斯消元】【图论】[Wc2011][HYSBZ/BZOJ2155]Xor
题目大意找1到n的路径中异或和最大的路径。分析首先,我们考虑这样一个问题:先看另一道题N个点M条边的边带权的无向图,求一个回路使XOR和最大(回路中的路径可以走多次)。另一道题的分析有这样一个结论(从这里到证明结束的所说回路只能走一次) 两个回路的和仍是回路(‘和’ 指 ‘异或和’/‘对称差’) 一个无向连通图G中有且仅有M-N+1个独立回路。那什么是独立的回路呢,就是一个不能由其他的回原创 2016-01-31 16:39:54 · 900 阅读 · 0 评论 -
【树的点分治】【平衡树】[POJ1741]Tree
题目大意给出一棵树,边带权,问有多少条长度路径<=k的路径。分析点分治暴力做法为O(n2)O(n^2)我们可以将统计所有路径转化为递归查找通过某个特殊点的路径,从而降低复杂度。将这个点定为重心,复杂度可以降低为O(nlogn)O(nlogn)复杂度分析重心有一个性质,如果以它为根,它的最大一个子树的大小不超过2tot\frac{2}{tot}。如果超过,那么在那棵子树里面一定有一个点它最大的子树小于原创 2016-02-25 17:25:28 · 697 阅读 · 0 评论 -
【最小生成树】[USACO 2016 February Contest, Gold]Fenced In
题目大意农夫FJ的奶牛们有空旷恐惧症,所以,FJ打算在他的农场围上篱笆。他的农场是一个矩形区域。左上角的坐标是(0,0),右下角的坐标是(A,B),FJ修建了n(0<=n<=2000)个竖直的篱笆,其横坐标分别为a1,a2,a3,……,an,其中0分析可以轻易地看出这道题是要求最小生成树,处理出连通块之间栅栏的长度然后做最小生成树即可。 但是这样会Time Limited Exceed,尽管算法时原创 2016-03-12 16:03:23 · 852 阅读 · 1 评论 -
【Prufer数列/组合数学】[HNOI2008][HYSBZ/BZOJ1005]明明的烦恼
题目链接分析Prufer数列生成Prufer数列由一棵树得到它的 Prufer Sequence 总共需要 n-2 步,每一步都在当前的树中寻找具有最小标号的叶子节点(度为 1),将与其相连的点的标号设为 Prufer Sequence 的第 i 个元素,并将此叶子节点从树中删除,直到最后得到一个长度为 n-2 的 Prufer Sequence 和一个只有两个节点的树。 所以一个树,只能得到一个原创 2016-02-02 22:10:53 · 839 阅读 · 0 评论 -
【LCT维护最大生成树】[HDU5389]GCD Tree
题目 分析:由于wt(u,v)=gcd(u,v),所以我们枚举gcd,而且只尝试连接gcd和它的倍数,也就是我们尝试连接(i,j),仅当j是i的倍数,至于于为什么,我也不知道。 用LCT维护最大生成树,每次连接一条边时,必定形成一个环,删除这个环中最小边即可。#include<cstdio>#include<algorithm>#include<vector>using namespace原创 2015-12-17 22:08:08 · 1208 阅读 · 0 评论 -
【动态树LCT】[SDOI2008]洞穴勘测
题目描述 辉辉热衷于洞穴勘测。某天,他按照地图来到了一片被标记为JSZX的洞穴群地区。经过初步勘测,辉辉发现这片区域由n个洞穴(分别编号为1到n)以及若干通道组成,并且每条通道连接了恰好两个洞穴。假如两个洞穴可以通过一条或者多条通道按一定顺序连接起来,那么这两个洞穴就是连通的,按顺序连接在一起的这些通道则被称之为这两个洞穴之间的一条路径。 洞穴都十分坚固无法破坏,然而通道不太稳定,原创 2015-12-03 13:52:41 · 108 阅读 · 0 评论 -
【树的遍历】[NOI2011]道路修建
题目描述Description在 W 星球上有 n 个国家。为了各自国家的经济发展,他们决定在各个国家之间建设双向道路使得国家之间连通。但是每个国家的国王都很吝啬,他们只愿意修建恰好 n – 1条双向道路。 每条道路的修建都要付出一定的费用, 这个费用等于道路长度乘以道路两端的国家个数之差的绝对值。例如,在下图中,虚线所示道路两端分别有 2 个、4个国家,如果该道路长度为 1,则费用为1×|2 –原创 2016-07-13 09:38:06 · 563 阅读 · 0 评论 -
【基环树DP】[NOI2012]迷失游乐园
题目描述Description放假了,小Z觉得呆在家里特别无聊,于是决定一个人去游乐园玩。进入游乐园后,小Z看了看游乐园的地图,发现可以将游乐园抽象成有n个景点、m条道路的无向连通图,且该图中至多有一个环(即m只可能等于n或者n-1)。小Z现在所在的大门也正好是一个景点。小Z不知道什么好玩,于是他决定,从当前位置出发,每次随机去一个和当前景点有道路相连的景点,并且同一个景点不去两次(包括起始景点)。原创 2016-07-13 10:17:11 · 600 阅读 · 0 评论 -
【树链剖分】[ZJOI2008][HYSBZ/BZOJ1036]树的统计Count
题目链接树链剖分模板题代码#include<cstdio>#include<algorithm>#include<cstring>#define INF 0x7fffffffusing namespace std;#define MAXN 100000int n,a[MAXN+10],b[MAXN+10];void Read(int &x){ char c; while原创 2016-02-05 16:53:32 · 455 阅读 · 0 评论 -
【BFS和DFS的性质】[NOI2013]树的计数
题目描述我们知道一棵有根树可以进行深度优先遍历(DFS)以及广度优先遍历(BFS)来生成这棵树的 DFS 序以及 BFS 序。两棵不同的树的 DFS 序有可能相同,并且它们的 BFS 序也有可能相同,例如下面两棵树的 DFS 序都是 1 2 4 5 3,BFS 序都是 1 2 3 4 5。现给定一个 DFS 序和 BFS 序,我们想要知道,符合条件的有根树中,树的高度的平均值。即,假如共有 KK 棵原创 2016-07-07 22:07:31 · 828 阅读 · 0 评论 -
【网络流】[Codeforces - 739D]Recover a functional graph
题目大意有一个n个点的有向图,每个点的出度为1。 对于每个点,有两个信息,一个是这个点到环的距离x,一个是这个点能够到达的环的长度y。 有一些点的的某些信息未知,求能否构造出这样一个图。分析对于两个信息都已经知道的点,我们就可以根据这些点来算出我们还需要哪些点。 那些有部分信息未知的点就可以向需求连边,跑网络流。 如果所有需求都能被满足,则有解。 特别地,对于y未知的点,如果原创 2016-12-02 19:16:52 · 682 阅读 · 0 评论 -
【NOI2016】网格
题目描述输入输出样例输入 4 4 2 1 1 4 4 2 3 1 1 2 2 2 2 1 1 2 2 1 1 0样例输出 2 1 0 -1分析我们很容易看出答案只有可能是2,1,0,-1。关于一些表述的解释 我们将蝈蝈所在格子称为障碍,其余格子称为空地。 根据题意,我们可以看做最外围也是一圈障碍,但是我们不去管它,一下所提到的障碍都不包括外围的一圈原创 2017-02-18 23:01:44 · 1706 阅读 · 0 评论 -
最小费用最大流
bool spfa(){ int u,v; memset(pre,0,sizeof pre); memset(dist,0x7f,sizeof dist); dist[S]=0; vis[S]=1; q.push(S); while(!q.empty()){ u=q.front(); q.pop();原创 2015-08-26 20:19:14 · 605 阅读 · 0 评论 -
【floyd倍增】[USACO 'NOV07][POJ3613]COW RELAYS
题目 分析:题目大意即在一个无向图中,询问从起点到终点,走n步的最短路。最多100条边,所以最多100个点,对点进行离散化。用floyd求最短路,因为floyd就是向中间插点(插点法)所以只需要做n次floyd,同时使用倍增来加速。#include<cstdio>#include<algorithm>#include<cstring>using namespace std;#define原创 2016-01-25 23:18:18 · 109 阅读 · 0 评论 -
【图论】[ZOJ1054]Place the Robots
题目分析:二分图匹配,和ZOJ1052差不多,但是草地在计算连通块是当做空地,在连边是如果交点是草地则不连边。代码:#include<cstdio>#include<cstring>#define MAXN 50int n,a[MAXN+10][MAXN+10],cnt,cnt1,c[MAXN*MAXN*2+10],ans,T,m;char s[MAXN+10][MAXN+10];bool原创 2015-08-26 20:16:11 · 507 阅读 · 0 评论 -
【图论】【最小生成树】[IOI2003]maintain
题目描述:点击此处 解题思路: 在加边的同时对边进行插入排序,当边的数量≥n-1时,进行kruskal,此时每次kruscal的复杂度为O(m),算法的时间复杂度为O(m^2)实现代码#include<cstdio>#include<cstring>#define INF 0x7f7f7f7f#define MAXN 200#define MAXM 6000#include<algor原创 2015-08-26 20:08:11 · 840 阅读 · 0 评论 -
【图论】【A*搜索】[POJ2449]Remmarguts' Date
题目 本题实质是求第k短的路径; SPFA+A* 进行启发式搜索直至访问终点k次, 估值函数:当前已经走的距离+当前点到终点的最短路 注意:当s==t时,要特判#include<cstdio>#include<queue>#include<cstring>#include<cstdlib>using namespace std;#define MAXN 1000#define原创 2015-08-26 20:17:18 · 362 阅读 · 0 评论 -
【NOIP2001】Car的旅行线路
题目描述:点击此处 解题思路: 平行四边形相对顶点的横坐标、纵坐标之和分别相等。 将所有机场的坐标都算出来之后,再根据题目描述连边,从出发地的四个机场或到达地的四个机场分别做单源点最短路。实现代码:#include<cstdio> #include<cstring>#include<cmath> #include<algorithm> #include<queue> #include原创 2015-08-26 20:09:48 · 536 阅读 · 0 评论 -
【搜索】[HDU1175]连连看
题目 分析:这道题看到的第一反应应该就是BFS或者DFS,裸的DFS、BFS显然会TLE,所以我就想用A*,不过好像并不好写启发函数。 枚举步数不行,就枚举边吧。因为允许有两次转折,所以最多有三条边枚举中间的一条边,然后进行check,这道题只用了两个for循环就AC了。代码:#include<cstdio>#include<queue>#include<algorithm>原创 2015-08-26 20:13:16 · 507 阅读 · 0 评论 -
【图论】[CQBZOJ1362] 苗条的生成树
题目描述:点击此处 解题思路: 构造最小生成树,并计算苗条度,然后不断删最短边,构造最小生成树,计算苗条度,直至图不再连通,输出苗条度。 若一开始就不是一棵树,则输出-1;实现代码:#include<cstdio>#include<cstring>#include<algorithm>using namespace std;#include<climits>#define MAXN原创 2015-08-26 20:14:36 · 854 阅读 · 0 评论 -
【树DP】[CodeForces - 581F]Zublicanes and Mumocrates
Codeforces - 581F分析:根据题意,这是一棵树,在看看数据范围和时间,显然是树DP 用f[u][j][c]表示以u为根,当前点党派为c是,选取j个叶子节点(dead end squares)给0党派的时候,连接双方的边的最小值。f[u][j+k][c]=min(f[u][j+k][c],f[u][j][c]+f[s][k][c’]+(c!=c’));显然,在状态转移的时候,会有更新了原创 2015-09-29 11:14:04 · 71 阅读 · 0 评论 -
【图论】【贪心】[coci CONTEST #1 2014.10.18]MAFIJA
题目 分析:这道题一看就是一道求最大独立集的题目,然而由于是一个普通的图,所以无法直接求。 贪心思路:如果一个点入度为0,则它一定可以为杀手,这时可以将这个点和它所指向的点删掉,继续找入度为0的点。 如果没有入度为0的点了,则剩下的点一定处于环中,这时可以任意将一个点当做平民删去,则可以继续算法了。#include<cstdio>#define MAXN 500000int n,a[MAX原创 2015-09-15 21:10:04 · 102 阅读 · 0 评论 -
【树DP+LCA】[CQBZOJ2937]避难向导
题目描述 “特大新闻,特大新闻!全国爆发了一种极其可怕的病毒,已经开始在各个城市 中传播开来!全国陷入了巨大的危机!大量居民陷入恐慌,想要逃到其它城市以 避难!经调查显示,该病毒来自于C 市的A 学校的一次非法的……” “哎。”你关上电视,叹了口气。作为A 学校的校长,你一天前为了保命,独自 逃离了A 学校,抛弃了全校师生,包括那个曾经帮你计算并拆除道路的工程师。 你良心受到了巨大的谴责,因此决原创 2015-10-11 12:25:55 · 885 阅读 · 0 评论 -
【树链剖分】[ZJOI2008]树的统计Count
题目 树链剖分,再存代码。#include<cstdio>#include<algorithm>#define MAXN 30000#define MAXLOG 15#define INF 0x7fffffffusing namespace std;int m,n,size[MAXN+10],dep[MAXN+10],f[MAXN+10][MAXLOG+1],bl[MAXN+10],p原创 2015-11-15 22:12:58 · 545 阅读 · 0 评论 -
【树链剖分】[SPOJ-QTREE]Query on a tree
题目 模板题,存代码。#include<cstdio>#include<cstring>#include<algorithm>using namespace std;#define MAXN 10024#define MAXLOG 14#define INF 0x7fffffffint n,T,size[MAXN+10],dep[MAXN+10],fa[MAXN+10][MAXLO原创 2015-11-15 20:54:26 · 372 阅读 · 0 评论 -
【树链剖分+线段树】[noi2015]软件包管理器
题目 先树链剖分,再根据dfn建立线段树(在同一根树链中的点dfn是连续的),然后,就很好做了。#include<cstdio>#define MAXN 100000int n,fa[MAXN+10],size[MAXN+10],pos[MAXN+10],length[MAXN+10],bl[MAXN+10],Q,dfn[MAXN+10],dcnt,ed[MAXN+10];bool f[MA原创 2015-11-28 23:43:46 · 482 阅读 · 0 评论 -
【高级数据结构】[SPOJ QTREE]树链剖分/动态树各一模板
题目: 树链剖分:#include<cstdio>#include<cstring>#include<algorithm>using namespace std;#define MAXN 10024#define MAXLOG 14#define INF 0x7fffffffint n,T,size[MAXN+10],dep[MAXN+10],fa[MAXN+10][MAXLOG+原创 2015-12-01 13:16:35 · 486 阅读 · 0 评论 -
【线段树】[BZOJ2104/WC2009]最短路问题
题目描述分析在一个长条状的东西上维护信息,我们可以想到使用线段树。 对于一个对应范围为[L,R][L,R]的节点,我们维护区间内最左边的那一列的点的每一个点和最右边一列的每一个点两两之间只经过[L,R][L,R]的点的最短路。 关于合并,可以查看http://blog.csdn.net/iamzky/article/details/42119193 关于最后求答案呢。 我们求出1..l +原创 2017-07-15 17:24:56 · 837 阅读 · 0 评论