ACM_图论
羁绊残阳
四川大学计算机科学与技术
展开
-
coderforces #284(Div.2)
背景:第一次打coderforces,只出了a,b两题·,c题在会长指导下过。A:水B:简单字符串处理C:题意是从A到B,不能走交叉点,求A到B最少要走的步数,等价于求与线段AB相交的直线个数。证明:由于从A到B不能走直线交叉点,所以必须跨过其线段间的所有直线,每条直线只走一步就是最少。解法:由于告诉了所有直线方程,只需根据若两点在直线异侧则直线在线段间。原创 2015-01-04 20:13:31 · 880 阅读 · 0 评论 -
hdu5727 枚举排列 + 二分图匹配
可以先枚举阴珠子的排列,因为是环,所以起点无所谓,最多8!8!然后再让阳珠子去插空,对于不损坏的建立边,求最大匹配就是了。 这里二分图最大匹配的无向图,两边的节点编号不是一样的,竟然搞混淆了。。。 这样复杂度是O(n!∗n∗n2)O(n!*n*n^2)#include <cstdio>#include <ctime>#include <set>#include <iostream>#原创 2016-07-23 16:25:04 · 335 阅读 · 0 评论 -
SCU2016-05 A题无向图割顶
Analyse: 求无向图的割顶。求出所有割顶之后,对每个割顶看它有多少个连通分量被割开/**********************jibancanyang************************** *Author* :jibancanyang *Created Time* : 三 7/13 11:05:57 2016**Problem**:**Get**:*原创 2016-07-13 11:43:37 · 268 阅读 · 0 评论 -
SCU2016-07 T题 prim算法
把已经设好的边花费改为0,求最小生成树即可。#include <cstdio>#include <iostream>#include <cstring>#include <vector>#include <queue>using namespace std;#define pr(x) cout << #x << ": " << x << " " #define pl(x) cout原创 2016-07-25 10:58:39 · 315 阅读 · 0 评论 -
Codeforces Round #362 (Div. 2) C. Lorenzo Von Matterhorn (map离散化)
Problem: Codeforces Round #362 (Div. 2) C. Lorenzo Von Matterhorn (map离散化) Analyse: 题意不赘述,根据题意可以构造出一个以11为根节点的二叉树。 然后我们用dp[0][i]dp[0][i]表示以ii为父亲节点,发出的连向它的左二子的边的长度。dp[1][i]dp[1][i]表示以ii为父亲节点,连到右儿子的长度。原创 2016-07-15 11:43:14 · 486 阅读 · 4 评论 -
SCU2016-06 Q题并查集 + set
题意:给你一些交换规则,然后求任意使用这些交换规则后,排列的字典序最大。 分析: 很容易想到贪心的满足前面的为最大的贪心。 然后对于这些交换规则建图,任意一个联通分量里的元素是可以互换的。 我们把这个联通分量的所有值加入一个set,然后从联通分量重靠前的数开始在set末尾取即可。 求联通分量用并查集即可。 心得: 并查集可以直接给连通分量标号。 二元互换关系很容易写成无向图中的边建图原创 2016-07-16 10:29:07 · 361 阅读 · 0 评论 -
SCU2016-01 N dijkstra
裸的dijkstra 竟然因为pii元素顺序错了wa了一发 优先队列的大小完全是反的,重载大于符号,或者greater仿函数都是最小堆。/*** ***/#include <cstdio>#include <cstring>#include <iostream>#include <algorithm>#include <vector>#include <queue>#inclu原创 2016-07-05 22:46:55 · 291 阅读 · 0 评论 -
SCU2016-01 O题dijkstra变形或者最小生成树变形
Analyse: 把边从大到小排序,然后依次加边,直到1和n连通的最小边长即可。 另一种思路: 考虑dijkstra求最长路我们知道,这里求最大承重量也行。 定义d[i]d[i]为从11到ii的承重量,然后松弛操作是d[j]=min(d[i],cost(i,j))d[j] = min(d[i], cost(i, j)) 可以知道dijkstra的性质不受松弛操作的影响而影响,因为在路径长度原创 2016-07-05 23:40:36 · 460 阅读 · 0 评论 -
hdu 5723 (最小生成树 + 树上的期望)
多校简单题 - 第一个问,最小生成树。 - 第二个问,求出最小生成树后建图。 枚举每一条边,然后期望是边的期望和,边的期望就是两边节点数的乘,乘以花费。#include <cstdio>#include <cstring>#include <iostream>#include <algorithm>#include <vector>#include <string>#incl原创 2016-07-20 11:41:23 · 1280 阅读 · 0 评论 -
SCU2016-02 A题(LCA)
分析:求树上最短距离,Tarjan算法处理出距离根节点的距离,然后两个相加减去二倍距离根节点的距离即可。#include <cstdio>#include <cstring>#include <vector>#include <iostream>#include <algorithm>using namespace std;#define pr(x) cout << #x << ": "原创 2016-09-09 16:48:59 · 209 阅读 · 0 评论 -
SCU2016-02 B题 (缩点+LCA)
分析:把强联通分支全部缩成点,变成一颗树,然后跑一下LCA,每一次加边都会在树上形成一个环,环上所有的边都将不再是桥,并且把环缩成点。#include <cstdio>#include <cstring>#include <vector>#include <iostream>#include <algorithm>using namespace std;#define pr(x) cou原创 2016-09-09 16:57:32 · 224 阅读 · 0 评论 -
SCU2016-01 G题(最大流 + floyd_warshall)
分析:其实就是经典的限制终点的容量的最大流。建立超级源点和汇点。最小化最大路径,二分一下。对于任意最短路Floyd_warshall一下。 code:#include <cstdio>#include <cstring>#include <iostream>#include <algorithm>#include <vector>#include <queue>using namesp原创 2016-08-26 19:25:24 · 517 阅读 · 0 评论 -
SCU2016-01 H题 (二分图带权匹配 KM算法)
分析:裸的求最大匹配和。 如果是求最大配积的话,可以先求权值的自然对数的最大匹配和,最后的最大匹配和再取e的幂次就可,当然有精度问题。#include <cstdio>#include <cstring>#include <iostream>#include <algorithm>using namespace std;#define pr(x) cout << #x << ": " <原创 2016-08-30 11:16:52 · 514 阅读 · 0 评论 -
hiho一下 第112周 Total Highway Distance (树的所有路径)
分析:很套路的一个树的题,经过一条边的所有路径的数目。 遍历以每个节点为根节点的子树的节点的个数即可求出路径数。 对树进行dfs,要记录父亲节点,防止方向边出现。#include <cstdio>#include <cstring>#include <iostream>#include <algorithm>#include <vector>using namespace std;#原创 2016-08-21 03:31:42 · 322 阅读 · 0 评论 -
soj4522 完全二分图的判断
题意: 有三个字母aa,bb,cc,只有相邻字母或者相同字母才连边。现在给你一个无向图,问你是否是这个规则建立出来的。 分析: - wa了很多次,还是思路没有分析好 - 观察发现只有a,ca,c这对之间不能有边相连接,图2着色问题,就是完全二分图。 - 注意除了孤立点,整个图是个完全二分图。#include <cstdio>#include <iostream>#include <ve原创 2016-06-04 17:29:43 · 1228 阅读 · 0 评论 -
soj 4512 有向图环
根据显示性质,建图思路很巧妙。 建图之后有向图判断环,方法:dfs树,没有退化边。/**********************jibancanyang************************** *Author* :jibancanyang *Created Time* : 四 6/ 2 10:26:53 2016**Problem**:**Analyse**:原创 2016-06-03 11:00:25 · 252 阅读 · 0 评论 -
poj3169 差分约束系统
题意:从1到n,n个数,从左向右一次排列。给定两种形式的约束条件: 1.xix_i与yiy_i的最大距离为dkd_k 2.xix_i与yiy_i的最小距离为dkd_k 问满足这些限定条件的情况下,数1和n的最大距离是多少?(若约束条件相互矛盾则输出-1,若最大距离可以为无穷大则输出-2)知识补充:差分约束系统的概念:由n个变量和m个约束条件(实数)组成,且都是形如:xi−yj≤bk(x,y为原创 2015-07-25 18:07:34 · 868 阅读 · 5 评论 -
《挑战程序设计竞赛》 扩展欧几里得算法 + SPFA
知识补充:SPFA算法:Bellman-Ford算法的优化算法,方法是: 1.把当前点(最开始是起点)入队,并将标记是否在队列中的visit数组的当前点设为true。原创 2015-07-28 13:59:09 · 734 阅读 · 0 评论 -
poj 3255 最短路和次短路
题意:求从起点到终点的次短路Bellman-Ford算法:把有向图的边存起来,然后每次扫描所有边,来更新起点到每个点的最短路,当这一次扫描,一次更新都没有的时候,说明所有顶点的最短路已经求得。复杂度是O(|E|∗|V|)O(|E|*|V|)。根据这个思想还可以来判断图中存不存在负圈。Dijkstra算法(戴克斯特拉):1.初始所有顶点都是未使用过,且除了起点最短距离为0外,所有顶点最短距离原创 2015-07-21 11:45:32 · 771 阅读 · 0 评论 -
poj 2139 Floyd-Warshall算法求最短路
题意:不想说,这个题意思了,含糊不清=-= Dijkstra算法,无法计算有负边的图,原因是有负边的图存在是会打乱Dijkstra算法的前提,当前优先队列取出点的距离为起点到该点的最小距离,因为如果后面有负边这个距离会更小。除此之外Bellman-Ford算法和Floyd-warshall算法都可以计算有负边的图,且判断是否有负圈。Floyd-Warshall算法:该算法用到了动态规划归约的思想原创 2015-07-22 11:16:29 · 686 阅读 · 0 评论 -
poj 3723 Kruskal最小生成树
题意:一堆男女加进一个组,每人的加入费用是10000元。男女之间存在一种亲密度,在加入一个人的时候,ta的加入费是10000减去已经入组的异性中和亲密度最大的。问以某种顺序入组,的最小总费用是多少?思路:主要是把这些亲密关系看做无向图,然后要以最小的代价包含所有人,显然是最小生成树。我的做法是,先把有亲密关系的那些人建立无向图,然后求出最小生成树。剩下的人入组费统一10000元。知识补充:原创 2015-07-24 11:49:58 · 762 阅读 · 0 评论 -
Codeforces 295 B Greg and Graph (Floyd_Warshall的深入理解)
@(K ACMer)By题解工厂题意分析Code题意:给你一个有向图,图中任意两点间皆有两个方向的两条边.并给定一个序列,按照序列顺序删除图中的顶点,问每次删除一个顶点之前图中所有两点间的最短距离为多少.分析:想到任意两点间的最短距离首先想到的就是Floyd_Warshall算法.要做这个题需要深入理解该算法的思想. 先看原始的算法实现:void floydwarshall(void){原创 2015-09-03 21:54:49 · 630 阅读 · 0 评论 -
Codeforces 567E President and Roads (用Dijkstra求最短路条数 + 强连通桥)
@(K ACMer) by 题解工厂题意:给你一个有向图,问你这条边是不是最短路必须经过的边.如果不是能不能通过减少它的长度(但必须边的长度大于0)来让它成为必须经过的边.分析:先谈,判断一个路径(u, v)是不是最短路上的路.显然如果u到起点的距离加上v到终点的距离,再加上(u,v)边的长度等于起点到终点的最短路长度,那么这个边就可能是最短路上的路,但是不一定就是,因为也可能存在和它等效的边.原创 2015-09-06 15:12:47 · 791 阅读 · 2 评论 -
hdu2196 Computer (数的直径的性质)
@(K ACMer)题意: 给你一颗树,问你树上的每一个点和它距离最远的点的长度. 分析: 根据树的直径证明过程的中间引理:距离树上任意节点最远的点,一定是树点直径的两个端点之一. 这样只需要两次dfs,找到树的两个端点,取每个节点距离这个两个端点的距离中较大的一个作为距离这个节点最远的距离即可. ps:开始因为邻接表没有初始化debug了半天….. 另一种想法:树形dp:距离每个节点最原创 2015-11-20 08:51:55 · 822 阅读 · 0 评论 -
poj 1985 Cow Marathon
@(K ACMer)题意: 求树的最长路径 分析: 两次dfs求树的直径,无它.#include <iostream>#include <cstdio>#include <cstring>#include <set>#include <map>#include <stack>#include <vector>#include <string>#include <queue>#原创 2015-11-19 14:17:20 · 346 阅读 · 0 评论 -
Codeforces 658 C. Bear and Forgotten Tree 3(树的构造)
@(E ACMer)题意:给出树的节点数,直径和高度,构造出这颗树. 分析: 本题还是wa了一次才ac,考验的是稳定,不要慌着,要让知识系统全面了再动手编码 - 对于长度为dd的树,显然它的最小高度为d+12\frac{d + 1}{2},这就是一个判读是否可以构成的不等式判断句. - 然后我们来贪心的构造这颗树,从树的根节点1开始,由它先派生出,树的高度的一条链,然后再由他派生出原创 2016-03-29 20:26:38 · 402 阅读 · 0 评论 -
cf667d 最短路建图 + 枚举 + 最优化剪枝
Problem: 给你一个边长为1的有向图,从一个点到另一个点你只能走最短路,找出四个点的链,让这条链最长. Analyse:首先我们bfs遍历出从每一个点出发到另一个点的最短路,复杂度O(|v|2)O(|v|^2),然后用这些最短 路建图,枚举这四个点中的中间两个点,然后我们发现由于是有向图,对于其中第二个节点我们需要的是到达它的节点 所以我们要再建立一个反图. 这里写出来超时,有一个最原创 2016-05-03 13:26:59 · 1378 阅读 · 0 评论 -
soj 4526 不重叠最短路条数
分析:记录路径,每一次最短路都删去边,最后最短路变长了就停止。/**********************jibancanyang************************** *Author* :jibancanyang *Created Time* : 一 5/30 17:18:48 2016**Problem**:**Analyse**:**Get**:*原创 2016-05-30 18:10:01 · 304 阅读 · 0 评论 -
poj 2778 AC自动机构建有向图 + 邻接矩阵快速幂
Problem: 给你mm个病毒串,求指定长度n且不含病毒串作为子串的字符串一共有多少种. Analyse: 用AC自动机构建LL个状态节点,每个节点的end标记记录是否在这里形成病毒串. 这里有个核心就是,如果当前后缀的子后缀(也就是它的fail指针指向的地方)是病毒串的话, 那么它就是病毒串. 然后根据这个AC自动机的LL个节点来建立有向图的邻接矩阵B,B[i][j]代表从i到j状态原创 2016-05-09 14:20:32 · 836 阅读 · 0 评论 -
SCU2016-01 J 题 欧拉路径
分析只有七中数字,那么图中的边数也不会太多。直接dfs去找一条欧拉路径就可以了。。。 欧拉回路和欧拉路径都可以直接dfs找#include <cstdio>#include <cstring>#include <iostream>#include <algorithm>using namespace std;#define pr(x) cout << #x << ": " << x <<原创 2016-09-04 23:21:15 · 356 阅读 · 0 评论