随笔分类 - 图算法
摘要:Delivery题目还是自己看吧 - -! 看似图论,实际上是一个考察思维以及数据结构的题。 我们对于先前和向后的边分别进行统计。 对询问离线。 小边按照左端点从大到小排序。 1.对于向后的边,询问按照出发点从大到小排序。比如询问有 2 3 3 4 我们先对3 4进行计算。把向后的小边(3,5) ,(3,4) 用线段树维护,分别在线段树的位置4,5中插入用该边时可以优化的值。询问3 4时,我们发现出发点3以及后面的小边都加进了线段树中,直接询问线段树区间 [3,4]的最小值进行计算即可。注意一下可能加入了边之后比不加边更差的情况。 然后再对2 3进行计算,这次把小边(2,...
阅读全文
摘要:题目:给出空间中的n对点,要求从每对点中选出一个,使得最近的点的距离最远。分析: 二分的思想很明显,二分答案之后,建图:如果两点之间的距离小于二分值时,连接相应的边,通过2-sat判断一下即可。 注意到题目的要求是向下取整,于是我们可以先*10000,最后直接取模即可。#include #include #include #include #include #include #include #include #include #include #include #include using namespace std;typedef long long ll;typedef unsign..
阅读全文
摘要:题目:还是自己看题目吧trick:当不连通时不需要人去炸。否则,当桥的费用为0时当然需要一个人去炸。。。#include #include #include #include #include #include #include #include #include #include #include #include using namespace std;typedef long long ll;typedef unsigned long long ull;#define debug puts("here")#define rep(i,n) for(int i=0;i#d
阅读全文
摘要:题目:给出平面上n个点,现在找m个点,并且使得这m个点最近的两个最远。分析:显然这满足二分的性质,二分答案,根据点距离需要大于等于二分值重新构造新图,则问题变成了:在新图中找出满足所有点对之间的距离大于等于二分的值的一个子图。因此在新图中寻找最大团即可。具体看代码#include #include #include #include #include #include #include #include #include #include #include #include using namespace std;typedef long long ll;typedef unsigned lo
阅读全文
摘要:说明摘自:pushing my way的博文最大团通过该博主的代码,总算理解了最大团问题,但是他实现时的代码效率却不算太高。因此在最后献上我的模板。加了IO优化目前的排名是:6yejinru328MS288K2822BC++2013-09-14 10:53:35问题描述:团就是最大完全子图。给定无向图G=(V,E)。如果UV,且对任意u,vU 有(u,v)E,则称U 是G 的完全子图。G 的完全子图U是G的团当且仅当U不包含在G 的更大的完全子图中,即U就是最大完全子图。G 的最大团是指G中所含顶点数最多的团。例如: (a) (b) (c) (d)图a是一个无向图,图b、c、d都是图a的团,且
阅读全文
摘要:4612Warm hdu up题目:给出一个图,添加一条边之后,问能够在新图中得到的最少的桥的数量。分析:我们可以双联通分量进行缩点,原图变成了一棵树。问题变成了:求树中添加一条边之后,使得不在圈的边最少。显然求一边直径,用总边数减掉最长路上的边数就是答案。注意数据存在重边的情况。#include #include #include #include #include #include #include #include #include #include #include #include using namespace std;typedef long long ll;typedef un
阅读全文
摘要:hdu 2121题目:给出m条有向路,根不确定,求一棵最小的有向生成树。分析:增加一个虚拟节点,连向n个节点,费用为inf(至少比sigma(cost_edge)大)。以该虚拟节点为根求一遍最小树形图算法,这时肯定存在解,如果费用>=inf时,说明无解。这是因为sigma(cost_edge)<inf。如何求得根?在寻找前驱时发现为根,则更新一下那条边的边号即可。hdu 4009题目:n个地方需要供水,可以自己挖水井供给自己,或者可以从别的地方供水,给出各自的方案,问对n个城市供水的最小费用。分析:由于可以自己供应给自己,题目显然有解。跟上题相似,添加一个虚拟节点,对n个城市连边,
阅读全文
摘要:最小树形图求的是有向图的最小生成树,跟无向图求最小生成树有很大的区别。步骤大致如下:1.求除了根节点以外每个节点的最小入边,记录前驱2.判断除了根节点,是否每个节点都有入边,如果存在没有入边的点,说明树形图不存在,退出。3.沿着节点的前驱找,如果发现环,把环缩点。4.如果不存在环,结束。否则,跳到1.其实我是来贴模板的。。。比较好的讲解:最小树型图的求解与实现代码讲解比较好的:hdu4009 Transfer water ( 最小树形图的模板 )用IO优化时死活TLE,改了scanf就过了,后来用!=EOF发现数据不全,怪不得TLE了,囧#include #include #include #
阅读全文
摘要:118EBertownroads题目:把无向图指定边的方向,使得原图变成有向图,问能否任意两点之间互达分析:显然如果没有桥的话,存在满足题意的方案。输出答案时任意从一个点出发遍历一遍即可。求桥的话,利用tarjan算法的low和dfn值判断一下即可。#include #include #include #include #include #include #include #include #include #include #include #include using namespace std;typedef long long ll;typedef unsigned long long
阅读全文
摘要:题目:给出一个图,问最少删除多少个点,使得从点1到点n经过的点数超过k个。分析: 上网搜了一下,发现很多人用网络流做的,发现我不会。再后来看到这篇说网络流的做法是错的,囧。 后来发现点数有点少,直接上爆搜。每次搜索前先跑一遍最短路,判断是否满足,如果满足更新答案,退出。 否则,在求最短路时记录一下路径,然后枚举删除最短路上的点,继续搜。 第一次写时,记录路径用的是全局变量,每次搜下一层的时候就会变,发现居然也A了。。。 我试了一下,发现n不会等于1。。。#include #include #include #include #include #include #include #in...
阅读全文
摘要:2879: [Noi2012]美食节Time Limit:10 SecMemory Limit:512 MBSubmit:324Solved:179[Submit][Status]DescriptionCZ市为了欢迎全国各地的同学,特地举办了一场盛大的美食节。作为一个喜欢尝鲜的美食客,小M自然不愿意错过这场盛宴。他很快就尝遍了美食节所有的美食。然而,尝鲜的欲望是难以满足的。尽管所有的菜品都很可口,厨师做菜的速度也很快,小M仍然觉得自己桌上没有已经摆在别人餐桌上的美食是一件无法忍受的事情。于是小M开始研究起了做菜顺序的问题,即安排一个做菜的顺序使得同学们的等待时间最短。小M发现,美食节共有n种不
阅读全文
摘要:题目:给出一个图,从图中找出两条最短路,使得边不重复。分析:既然是最短路,那么,两条路径上的所有节点的入边(s,x)、出边(x,e)必定是最优的,即 dis[x] = dis[s]+edge_dis,dis[e] = dis[x]+edge_dis。 dis表示点x到节点1的最短路的距离。 所以建图时,先求一边最短路,根据最短路上的前驱(可能有多个)与该节点构成新图,对于新图求一遍最大流判断最大流是否大于等于2即可。 /*题目:给出一个图,从图中找出两条最短路,使得边不重复。分析:先求一遍最短路,最短路上的点可以构成一个新图,对于新图求一遍最大流,如果存在大于1的最大流,则有解。*/#...
阅读全文
摘要:題目: 給出一個圖,圖中所有的環的長度不大於3,現在需要分組,使得每個組不在同一個環內。分析: 求弦圖的染色數目。 具體請看這篇文章:弦图与区间图陈丹琦 MCS算法: col[i]表示點i與col[i]個已經遍歷過的點存在邊,即它不能用的顏色數。 找所有沒有遍歷過的點當中最大的col值的點。 從一個點出發,相鄰並且沒有遍歷過的 col[y] ++。 重複n次,max(col[i]+1)就是答案#include <cstdio>#include <cstring>#include <iostream>#include <algor...
阅读全文
摘要:/* * 分析: * 如果是动态使用tarjan求联通分量求缩点个数的话,肯定TLE。 * 我们可以离线把所有要摧毁的星球输入,然后从把所有要摧毁的星球都摧毁之后往摧毁之前 * 建图,使用并查集的方式合并联通块。 * */#include <cstdio>#include <cstring>#include <iostream>using namespace std;const int X = 400005;#define debug puts("here");int p[X];struct node{ int x,y,next;}edg
阅读全文
摘要:题目:uva 11324The Largest Clique从图中某点出发,求最远能够一次走过多少个节点分析:tarjan求gcc,然后构造出新图,新图是一个dag,对于dag上用dp求出最长路径即可。dp转移方程为dp[x] = size[x] + max(dp[y]); 缩点后有边x到y的边,记忆化搜索就行了,具体看实现代码#include <iostream>#include <cstring>#include <cstdio>#include <vector>using namespace std;const int maxn = 100
阅读全文
摘要:由于题目太多了,所以在更新过程中可能会出错,欢迎大家一起交流^_^。。。第一题题目:uva 11624 Fire二维迷宫中,有一些着火点(可能不止一个),给出你的初始位置,人与着火点都是每秒钟向相邻的格子移动一格,问人能不能够在火势到达之前走到边界,如果能够,输出最短的时间分析:对于着火点,可以预处理把所有的着火点都放进队列中,然后再用BFS处理出所有可燃烧的格子的最短到达时间。再用BFS来计算出人能够达到边界的最短间。。。#include <cstdio>#include <cstring>#include <iostream>using namespac
阅读全文
摘要:/*题目: 求最小费用最大流的裸模板分析: 每次找到一条最短路,然后记录下每个经过的节点的前驱结点,然后若能够 到达终点的话,从终点开始往回找到最小流,然后再从终点往回依次更改当 前每条边的流量以及反向弧,直到不能再找到一条最短路为止,找最短路的 算法是spfa*/#include #include #include using namespace std;const int maxn = 10005;const int maxm = 1000005;const int inf = 1e8;#define debug puts("here");int n,m,s,...
阅读全文
摘要:1 /* 2 *最大流模板(引用学长的模板。。。) 3 * SAP(当前弧优化+GAP优化)非递归形式 7 */ 8 9 #include 10 #include 11 #include 12 13 #define SETZR(a) memset(a,0,sizeof(a)) 14 15 using namespace std; 16 17 //定义常量:边数、点数和无穷 18 const int MAXM = 1000000; 19 const int MAXN = 10000; 20 const int INF = 1000000000; 21 22 /...
阅读全文
摘要:/*题目: 一个有n个节点的完全图,每条边、每个节点都有权值,在该图上求一个有m 个节点的生成树,使得该树的边权值和比点权和是所有m个节点的生成树中的 最小值,如果有多解输出字典序最小的分析: 递归枚举m个节点,然后根据prim算法求的该比率,记录最小的边权和比点权 和最小的那棵树即可*/#include <cstdio>#include <cstring>const int X = 17;#define INF 1e9int map[X][X];int wv[X],n,m;bool use[X];int ans[X];int mnode[X];double cn...
阅读全文
摘要:/*2011年北京区域赛A题Qin Shi Huang's National Road System题目: 秦始皇想要修公路,使得这n座城市可以互达,题目给出n所城市的二维坐标以及每座城 市的价值,现在有人可以免费帮助秦始皇修理任意一条公路,现在要想使得比率A/B最大, A表示这条公路所在的两座城市的价值,B表示所有的公路长度(不包括这条公路的长度)。分析: 想要比率最大,所以A要尽可能大,B尽可能小。要使B尽可能小的话,可以先求的最小生 成树,然后枚举在最小生成树上的每条边,删除该边后得到的两个点集中分别找到最大价值 的点(城市),然后更新答案。时间复杂度...
阅读全文