ACM 图论
文章平均质量分 80
嚜寒
盖士人读书,第一要有志,第二要有识,第三要有恒。
有志则不甘为下流;
有识则知学问无尽,不敢以一得自足,如河伯之观海,如井蛙之窥天,皆无识者也;
有恒则断无不成之事。
展开
-
HDU2066 Floyd 裸
1(1)Floyd()函数中,注意K在最外层(2)Floyd()函数中,注意注意在前两层循环后先筛掉一批,对随机数据防超时有很好的表现。2#include #include #include #include using namespace std;const int INF=0x3f3f3f3f;int s,d;int maxn;int mat[1010][10原创 2016-10-20 19:33:26 · 303 阅读 · 0 评论 -
HDU1241 DFS/BFS 求连通块
0) 遍历所有点,求出连通块的数量,每到一块油田,就采用DFS或者BFS消除该油田以及附近连通的油田。 注意(易错): ①二维数组mat[i][j],i是第几行,j是第几列,所以搜到一点再搜该点周围八个方位(+dir[i][j])时,以及确定是否超出地图范围时,注意i是纵向加减,j是横向加减,且(0,0)原点在左上角,向右原创 2016-05-11 11:56:07 · 5229 阅读 · 0 评论 -
UVA11280 最短路 + SPFA变形 + 单向链表存储边 + 结构体构造函数 + 鲁棒性
1)这道题有很多需要学习的地方,除了code技巧上的运用比如链表存储边、初始化、结构体构造函数,在思维上也有很多比如判断走哪个点除了花费以外还加了对停留次数的判断、而停留次数可能大于城市个数(对于查询数据做一个鲁棒性的判断)等等。值得经常#include #include #include #include #include using namespace std;const原创 2016-04-18 12:11:05 · 536 阅读 · 0 评论 -
HDU1301 最小生成树 + Prim +(Prim求最小生成树与Dijkstra求最短路的区别) (如此题不要误解题意为用Dijkstra!)
Prim 最小生成树 与 dijstra 最短路 很像,但是却不同。前者追求的是,将所有点走一遍,总路径最短,算法是不断更新确定的集合之中的点到集合之外的其他的点的最短距离,全部更新完以后,将这些把所有点连接起来的最短距离加起来就是所求。后者追求的是,从起点经过其他所有点,到达终点的路径最短,算法是不断更新从起点到确定的集合之外的其他点的最短距离,全部更新完以后,到终点的最短距离就是起点原创 2016-04-17 22:02:21 · 632 阅读 · 0 评论 -
HDU2544 最短路 + 裸 + dijkstra + 邻接矩阵
1)//hdu 2544,裸dijkstra#include #include using namespace std;const int maxn=120;const int INF=999999;int lukou[maxn][maxn];int visted[maxn];//区别该点是否进入确定的集合之中int d[maxn];//目前从起点出发,到第i点的最短距离i原创 2016-04-17 18:23:01 · 432 阅读 · 0 评论 -
HDU2544 最短路 + 裸 + Bellman-ford + 链表存储
1)//hdu 2544,裸Bellman-ford#include #include using namespace std;const int maxn=120;const int INF=0x3f3f3f3f;//这是10^9,近乎无穷大的意思int d[maxn];//目前从起点出发,到第i点的最短距离//用边的结构数组存储,则只存题目中给的边即可,需要更新时只将这些记录原创 2016-04-17 18:21:06 · 377 阅读 · 0 评论 -
HDU2544 最短路 + 裸 + Floyd + 邻接矩阵
1)//hdu2544 裸floyd#include #include #define INF 0x3f3f3f3fusing namespace std;int d[105][105];//i点到j点的花费void floyd(int n){ for(int k=1;k<=n;k++){ for(int i=1;i<=n;i++){ for(int j=1;j<=原创 2016-04-17 18:19:22 · 364 阅读 · 0 评论 -
HDU2544 最短路 + 裸 + 队列的SPFA + 链表存储
1)//hdu 2544 裸队列的SPFA+链表存储(或者用邻接矩阵二维数组,或第二唯不定长的vector邻接表)#include #include #include using namespace std;const int maxn=120;const int maxm=10010;const int INF=999999;//如果在算法中没有先判断是不是<inf,就直接原创 2016-04-17 18:17:01 · 516 阅读 · 0 评论 -
HDU1317 变形SPFA 求最大路 判断正环 点权替代边权 最短路求法灵活应用
1)因为不理解在这个题的环境下如何正确处理正环的问题,做了一下午,其中核心的两句代码已经在code中标出,并在code下面举出极端数据的例子。// 变形 spfa 求最大路,判断正环,点权替代边权,链表存储边#include #include #include #include #include #include using namespace std;const int m原创 2016-04-17 18:03:27 · 982 阅读 · 0 评论 -
hdu1016枚举递归-经典DFS-简单回溯入门
1)注意格式要求(@1234);先顺时针输出再逆时针输出并不用存储所有可能再倒着输出一遍,因为逆时针的输出被包含在前者之中,这里我应该是没读懂题意;之前在想怎么运行完一次之后或者找不到之后如何退回到上一步,是不是要return什么啊之类的,其实执行完递归就自动退回了,如果符合边界条件就输出,不符合就继续执行,然后自动退回到上一层,在上一层这个递归语句之后只是需要将相应的“标记数组”之类的,或者cu原创 2016-03-06 16:33:31 · 816 阅读 · 0 评论 -
UVA1600 Dfs回溯完全遍历+记忆化搜索(用最小距离剪枝)+细节处理 (值得复习)(水)
0) 题意和样例很清晰,不解释了。1)有三处需要注意的,处理该类问题的细节:Error ①:因为是Dfs递归处理,所以不能直接return moves,否则又一层一层退回来,并没有记录moves值。Error ②:注意对于走过的点,应该做标记,否则可能出现这样的情况,假如dir方向数组前两个方向依次是向下和向右,那么A点往下走到B点,B点下面没有了,往上走到A点,A点又走到B点原创 2016-06-11 23:29:00 · 510 阅读 · 0 评论 -
UVALive7220
1 题意A是出发点,B是到达点,0是障碍、不可达,1~9是该可达点的分值,玩家要不断将一些可达点变为障碍,然后获得该点的分数,直到A到B没有通路则停止将可达点变为障碍的动作,游戏结束。求最大获取的分是多少。2 分析从A和B分别出发,算出到其他点的sum,算出每条通路上减去一个点的分数后的最小值。,然后遍历所有点,而所有可达点之和的分数-(某条通路上减去一个点的分数)最大值就是结果。原创 2016-12-27 22:07:04 · 506 阅读 · 0 评论 -
HDU1102 最小生成树(已构造好部分边)Prim与Kruskal
0) 题意:已经在部分城市之间建造了道路,求再花费多少钱建造道路使得所有城市连通。 求连接所有点的最小花费,这是最小生成路问题,变形在于已经修建好了部分道路。之前的思路是,在所有未连接的点图中,如何构建出所有需要的道路,而在构建之前如何将已经修好的路放进去,事实上这样的思想不明确也不简洁。好的做法是将修好的道路的修建花费直接赋值为0。然后就可以直接上最小生原创 2016-05-11 16:15:03 · 409 阅读 · 0 评论 -
HDU1068 二分图 最大独立集
0) 题意:有人互相喜欢,则被认为是恋爱关系,如果我们去掉一些人,使得剩下的人都找不出互相喜欢的,那么剩下的人最多是多少呢? 分析:去掉一些人,去掉的是,经过选择,能形成最多的互相喜欢的情侣对,并从这些情侣对中每对去掉一个人,剩下的单身人数自然最多。这是个求最大独立点集的问题,最大独立点集=节点数-最大匹配数。 注意:之前总是错原创 2016-05-11 21:20:15 · 381 阅读 · 0 评论 -
HDU5444 2015长春网络赛H题(dfs遍历二叉树 简单模拟)
0)题意: 精灵们住在一颗二叉树上,为了方便邮递园送信,根结点的房间写了这棵树上的房间号分布,是按先序遍历给出的。(这个题的先序遍历顺序:1访问根结点,2先序遍历东边子树,3先序遍历西边子树),而房间号总是东边的房间小于西边的(不限是否在同一层)。然后给出要接受信件的房间号,将途径房间的房间号一并输出。1)#include #include using names原创 2016-05-13 15:48:11 · 590 阅读 · 0 评论 -
HDU5521 最短路,添加点
Inspire:将思路理清,将难点抛离出来,将问题抽象化,再思考解决方法。Analysis:最短路问题,难在建图。如果用邻接矩阵,边太多了,而点的个数我们可以接受,仔细读题发现,给出的集合内的任意的两个点的距离都是一定的,于是每个集合构造一个新的点作为中转站,集合内的点都连接两条线到该点,进来再出去,为了防止/2得到浮点数,所以进边和出边的权值都是t,最后结果/2。然后spfa搜两遍最短路,每原创 2016-10-11 12:07:32 · 434 阅读 · 0 评论 -
5927 Auxiliary Set (CCPC) 无根树转有根树
1无根树转有根数,另外注意递归函数有返回值时,莫忘判断,否则TLE#include #include #include #include using namespace std;int kk;vector son[100010];set sset;int p[100010];int a[100010];int visted[100010];int n,q;int原创 2016-10-06 20:59:03 · 330 阅读 · 0 评论 -
HDU5883 欧拉路径与欧拉回路的判定
1相关知识:1)定义欧拉路径/欧拉通路,通过图中所有边且每边仅通过一次的通路。具有欧拉通路而没有欧拉回路的图称为半欧拉图。 欧拉回路,构成回路的欧拉通路。具有欧拉回路的图称为欧拉图。2)定理无向连通图中,所有顶点的度数均为偶数则构成欧拉回路,所有顶点中有且仅有两个顶点的度数为奇数而其他点的度数为偶数那么构成欧拉通路。有向连通图中,每个顶点的入度等于出度构成原创 2016-09-21 11:08:03 · 430 阅读 · 0 评论 -
HDU5877 线段树,离散化,Dfs
#include#include#include#include#include#include#include #include#include#include#include#include#include#include#include#define memset(ss,b) memset((ss),(b),sizeof(ss))///#pragma comm原创 2016-09-20 22:51:44 · 257 阅读 · 0 评论 -
HDU1010 奇偶剪枝 + 预先筛选 + DFS搜索
0题目:题意很清晰,注意走过一个地方就不能再走(所以可以根据这一点,预先筛选掉很多随机数据文件,看code最后一个注释的地方),还要注意是恰好那个时间到达,所以要有足够的地方腾挪(结合刚才那一点因此多了一个预先筛选这样一个剪枝的手段。)1分析:主要学习奇偶剪枝和预先筛选的思想。补充,奇偶剪枝(摘自百度百科):现假设起点为(sx,sy),终点为(e原创 2016-08-12 15:33:36 · 270 阅读 · 0 评论 -
HDU5441 并查集+(按大小)预处理
0题目描述很清楚。1①单纯并查集超时,要先用两个sort进行预处理。②不能等并查集将每次所有的都合并完之后再计算,要一边合并一边计算!这个自己没想到,看了题解才知道!!③注意!用sort按大小预处理时,用数组存储结果和对应提出的id(输入顺序),最后按照id输出结果!2#include #include #include using namespace std;原创 2016-08-11 10:56:19 · 351 阅读 · 0 评论 -
POJ2349 最小生成树(Prim更适合稠密图)
0题意很简单,要求每个站点之间都要可以直接或者间接联系到,但是联系方式有两种,近距离的用无线(每个站点都有),远距离的用卫星(部分站点有卫星,且当两个站点都有卫星才可以用卫星直接联系),给出卫星站点数量,要求输出最大的两个无线站点之间的距离。1读完题意很容易想到最小生成树,但是卫星站点应该放到哪里?是先把距离最远的几个站点分配为卫星站点,再用Prim;还是先用Prim再将最小生原创 2016-08-03 23:52:56 · 1292 阅读 · 0 评论 -
POJ2524 并差集以及优化(路径压缩+按秩合并)的简洁介绍
0 题意很简单,略。1①关于按秩合并中秩的一点说明,我理解的秩是集合的深度,大部分博客的代码与我的理解想同(即2-④ Join()中按秩合并代码中的秩就是严格代表着集合的深度),但是有的博客上: p1=Find(a),p2=Find(b); if(rank[p1]<=rank[p2]){ parents[p1]=p2; rank[p原创 2016-07-29 23:57:19 · 755 阅读 · 1 评论 -
POJ2965 BFS(自己写队列)+状态压缩 OR 偶数格子的棋盘规律
方法1,BFS(自己写,不用STL,因为速度不够)+状态压缩bfs+状态压缩:不能用STL的queue,要自己用数组写一个queue,其次作为记录路径的数组不能放在每一个struct中,这样每一次操作之前复制一遍当前的结构体在此基础上进行操作,不但耗费了很多时间而且相当于保存了每一种路径,这没有必要并且也浪费时空开销。而因为visted数组的存在,保证了每一种状态只出现一次,所以结构体中只存储原创 2016-07-18 12:52:08 · 627 阅读 · 0 评论 -
POJ1753 状态压缩(+BFS) + 棋盘问题
0棋盘问题,改变一个子的颜色,这个子以及这个子周围的四个位置(左右上下)的子分别变色,求最少的改变次数。此类题大部分应该可以用状态压缩+暴力搜索解决。纯粹找规律不太合理。 1)第一种方法,状态压缩后BFS暴力搜索。因为棋盘很小,只有16个格子,枚举所有的状态共有2^16=65536种。所以有可以用int数组存储65535个状态用以确认哪一个出现了哪一个没出现,然后暴力枚举+BFS的原创 2016-07-12 22:13:25 · 1556 阅读 · 0 评论 -
hdu1116 欧拉图的判定(点的度数的判定+用非递归的路径压缩的并查集/dfs对连通图的判定)
0)题意: 给出一些单词,能否将所有单词(每个单词都要用上,给出几次就用几次)排成一列,且第i个单词的最后一个字母总是等于第i+1个单词的第一个字母。分析: 刚开始想用dfs,每个单词的第一个字母和最后一个字母作为点,但是题意是要把所有单词都用一遍,而并不是单纯将所有点都遍历一遍,单纯用dfs找出是否有这样的路径并不容易;而且1)#include #include #inc原创 2016-05-17 21:32:27 · 982 阅读 · 0 评论 -
HDU2444 二分图判断(BFS 的染色法) + 求最大匹配边数(DFS 的匈牙利算法)
0)二分图匹配有两种算法,一种是网络流中的最大流,另一种就是下面的匈牙利算法。①用染色法判断是否是二分图: 主要是怎么判断一个图是不是二分图。不妨选取某个点作为起点并染为某种颜色、同时把与它相邻的元素染为对立的颜色,进行BFS(DFS也可以),如果到某一步发现当前点和相邻点的颜色一样,那么就出现了矛盾,就不是二分图。②匈牙利算法求最大匹配数原理 是通过DFS原创 2016-05-07 19:55:31 · 2784 阅读 · 1 评论