![](https://img-blog.csdnimg.cn/20201014180756925.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
=====图=====
文章平均质量分 60
林伏案
妖蛾子良多的范老爷
展开
-
poj1236(*强连通分量,缩点)
/*translation: n个学校组成一个网络,给出链接情况(单向图)。求要使得报文能够发往全部学校,最少需要发送多少个报文。 要使得从任何一个学校能够到达任何一个学校,最少需要添加几条边?solution: 强联通分量,缩点 缩点后整张图就成了DAG,那么显然地第一个问题就是DAG上入度为0的点。主要在于第二个问题。如何添边才能得到最优解呢? 方法如下:首先缩点后,可以得到一个原创 2017-04-04 00:14:15 · 367 阅读 · 0 评论 -
poj3469(*最小割模型)
/*translation: 要在核A与核B组成的双核cpu上面运行n个模块,给出每个模块在核A、核B上运行的时间。除此之外,接下来还有m组需要交换数据的 模块。每当两组模块在一个核上运行时,不需要任何的额外花费,反之需要一定的额外花费。求运行完n个模块所需的最少时间。solution: 网络流最小割 这道题的本质就是求一个分组方案,在核A上面运行一组,在核B上原创 2017-02-09 22:17:19 · 302 阅读 · 0 评论 -
poj3281(#网络流最大流)
/*translation: n头牛,f种食物,d种饮料。每头牛有各自喜欢的食物和饮料。而每种饮料和食物只能分配给一头牛。最多能够有多少头 牛可以同时得到喜欢的食物和饮料。solution: 最大流 为了保证一头牛只享有一份食物和饮料。必须把牛拆成两点。一边和对应喜欢的食物连接,一边和对应喜欢的饮料连接。 然后每条边的容量是1.求最大流即可。note:原创 2017-02-09 20:30:30 · 245 阅读 · 0 评论 -
poj3057(*二分图匹配建模)
/*translation: 给出一张图,其中'.'代表人,'*'代表墙壁,'D'代表门。每道门在同一时刻只能通过一个人。问能否在 一定时间内使得所有人离开地图。若能,输出最后一个人的离开时间。若不能输出impossible。solution: 二分图匹配 将不同时刻的门看成是一侧的点。先预处理出所有人到各个门的最短距离。然后就是将门拆点,即拆成不同 时原创 2017-02-09 16:07:12 · 261 阅读 · 0 评论 -
poj2226(*行列模型,二分图最小顶点覆盖)
/*translation: 给出一张图'.'代表普通草地,‘*’代表泥地。有宽度固定为1,长度任意的木板。求至少要用多少块木板 才能覆盖所有的泥地而不覆盖任何的草地。solution: 二分图最小顶点覆盖 考虑以木板作为结点。分为两部分,一部分是横木板,一部分是竖木板。将横木板和竖木板都覆盖住的 泥地作为连接两边结点的边。这样求最小顶点覆盖即可实现每个原创 2017-02-08 16:05:27 · 534 阅读 · 1 评论 -
poj2724(*二分图最大独立集)
/*translation: 给出一台机器的操作序列。每次的操作都将产生若干结果。比如011操作产生结果011,*11操作产生结果011 和结果111...以此类推。现在给出若干个操作序列。求最少能用多少个操作完成这些结果。solution: 二分图最大独立集合 实际上就是求二分图最大独立集合,因为*能够同时当作01用,所以操作中应该尽量用*合并两个结果。所以原创 2017-02-08 10:11:05 · 268 阅读 · 0 评论 -
poj3692(二分图最大独立集)
/*translation: 一群男孩女孩,同性之间都相互认识,但是异性之间只有某些人认识彼此。给出相互认识的异性的各自编号。 然后求组成一个小队,这个小队里的人都相互认识。问这个小队最多能有多少人。solution: 根据 最大独立集合+最小顶点覆盖=点数 以及 二分图当中,最大匹配=最小顶点覆盖即可求出来note:*/#include #include #原创 2017-02-07 13:06:04 · 244 阅读 · 0 评论 -
poj1466(二分图求最大独立集合)
/*translation: 有n个学生,并且给出男女之间的暧昧关系。现在求一个学习小组,使得里面的任何两个人之间不能有暧昧关系。 求这个学习小组最多能够有多少人?solution: 二分图求最大独立集合 首先明白一个定理:|最大独立集合| + |最小顶点覆盖| == |V|。且在二分图当中有|最大匹配| == |最小顶点覆盖| 所以只要求出最大匹配即可原创 2017-02-06 12:20:39 · 439 阅读 · 0 评论 -
poj1486(二分图匹配)
/*translation: 有一堆透明的讲义堆叠在一起,每个讲义上的随机一个位置会有讲义的标号。因为讲义是透明的,所以堆叠在 一起的讲义使得这些标号分不清各自对应的讲义。现在要求你求出那些能够确定对应关系的讲义以及对应的标号。solution: 二分图匹配 首先当标号的位置落进某一个讲义的覆盖面积之内,这个标号很可能就是讲义对应的标号。所以连上一条边。原创 2017-02-06 10:25:40 · 477 阅读 · 0 评论 -
poj2112(二分网络流)
/*translation: 有c头奶牛和k台挤奶机,每台挤奶机器最多能够同时服务m头奶牛。且每个物体之间有一定的距离。 求一种分配方案,使得每头奶牛能够分配到机器的同时,最小化奶牛所走的最长距离。solution: 二分+最大流 看到最小化最大值之类的很容易想到用二分枚举答案。然后就是判定是否可行了。方法是每枚举一次, 就重新建图。建图时将距离超过枚举原创 2017-02-04 20:34:53 · 247 阅读 · 0 评论 -
aoj2249(dijkstra最短路)
/*translation: 给出一张图,删去其中一些边,使得满足2个条件。1:费用最小,2:首都1和其他点的最小距离不变solution: 最短路,dijkstra 首先求出最短路径,然后暴力求出答案即可note:date: 2016.10.19*/#include #include #include #include #include #include #inc原创 2016-10-19 22:55:37 · 450 阅读 · 1 评论 -
poj3268(最短路,dijkstra)
/*translation: 给出一张图,给出图中的一个点。求图中其它点到该点并回到原点的最长距离是多少?solution: dijkstra算法 首先可以很容易求出从x到其它点的最小距离。然后求其它点到x的最小距离可以将图中所有的边反向 然后求x到其它点的最小距离。如此只需要求两次即可。note: 1:本来以为无脑的对每一个点dijkstra会超时,没想到无脑的暴力dijkstr原创 2016-10-18 22:48:29 · 311 阅读 · 0 评论 -
uva820(最大流)
#include #include #include #include #include using namespace std;const int maxn = 10000 + 5;const int INF = 1e8;struct Edge{ int from,to,cap,flow; Edge(int u,int v,int c,int f):from(原创 2016-09-29 22:16:06 · 446 阅读 · 0 评论 -
poj1149(*网络流建模方法,paper题)
/*translation: 有M个猪圈,每个猪圈里初始时有若干头猪。一开始所有猪圈都是关闭的。依次来了N个顾客, 每个顾客分别会打开指定的几个猪圈,从中买若干头猪。每个顾客分别都有他能够买的数量 的上限。每个顾客走后,他打开的那些猪圈中的猪,都可以被任意地调换到其它开着的猪圈里, 然后所有猪圈重新关上。问总共最多能卖出多少头猪。(1 <= N <= 100, 1原创 2017-02-18 23:32:22 · 303 阅读 · 0 评论 -
poj3411(状态压缩dp,dijkstra最短路)
/*translation: 给出一张图,求节点0到节点n-1花费的最小费用。对于一条边a->b,可以有一下两种不同的付费方式: 1.在点c提前预付,但此时必须经过点c,花费为r 2.在点b支付,花费为psolution: 状态压缩dp+dijkstra dp[i][s]:=走到i点时的最优解,且此时走过的点状态为s(包括i) 然后根据dijkstra不断松弛即可。note:原创 2017-01-20 10:58:52 · 268 阅读 · 0 评论 -
poj3180(连通分量)
/*translation: 有若干头奶牛,有若干条绳子连接他们,若干头牛可以组成一个小组,条件是组内的奶牛个数大于等于2,且组内任意两头奶牛之间的绳子都可以 相互连接。(注意绳子是单向的)。问共可以组成多少组?solution: 其实就是求有多少个连通分量且联通分量内的点数大于2*/#include #include #include #include using nam原创 2017-03-29 10:33:35 · 548 阅读 · 0 评论 -
poj2186(*连通分量)
/*translation: 给定若干头牛和每头牛之间的关系,若牛A认为牛B受欢迎,牛B认为牛C受欢迎。则牛A认为牛C受欢迎。求牛群中总共有多少头 牛收到所有牛的欢迎。solution: 首先求强联通分量,求完之后可以将其缩点后的图看成一个有向无环图。根据强联通分量的性质,所求的答案肯定是一个强联通分量 中点的个数。那么这个强联通分量必定是缩点后有向无环图中出度为0的那个点(分量)。原创 2017-03-28 22:05:22 · 370 阅读 · 0 评论 -
poj3155(网络流最大密度子图模型)
/*translation: 公司里面有若干职员,每个职员都有一个或者若干个和自己不和的人,如果让两个不和的人在一起工作,则效率必然下降。 定义一个hard因子。hard:=互相不和的职工对数 / 总人数。现在求从公司里面选出一些人出来,使得hard因子最大。solution: 网络流解决最大密度子图。 paper题,参考论文“最小割模型在信息学竞赛中的应用”一原创 2017-02-02 12:04:10 · 492 阅读 · 0 评论 -
poj2914(stoer-wagner算法求解全局最小割)
/*translation: 给出一副无源汇的无向图,求其最小割。solution: 原本的想法是枚举源汇,然后DINIC最大流。然而这样必然超时。所以必须有一种办法能够快速求出 全局最小割,这种算法就是stoer-wagner算法。具体方法见链接:http://blog.sina.com.cn /s/blog_64018c2501011dd7.html以及http://blog.si原创 2017-01-30 16:13:32 · 494 阅读 · 0 评论 -
poj2987(网络最大流求最大闭合子图权值)
/*translation: 给出一张单向图,每个结点有固定的权值。每次选择一个点的同时,与该点单向连接的点也必须选择(比如u->v,选择u的同时 也必须选择v,但是对于k->u,k就不是必选的。)现在求一种选择方案使得其选择的权值最大的同时,选择的点数目最小。solution: 网络流求最大闭合子图的权值 具体的做法参考“最小割模型在信息学竞赛中的应用”这一论原创 2017-01-29 22:17:53 · 1259 阅读 · 1 评论 -
hdu4322(*最小费用流)
/*translation: n颗糖果,m个孩子。每个孩子有若干个自己喜欢的糖果。一旦这个孩子得到一颗自己喜欢的糖果,这个孩子的欢乐值上升k。如果 得到一颗普通的糖果,欢乐值上升1,一旦孩子的欢乐值达到b[i],这个孩子就很开心。问能否有一种分配方法,使得所有的孩子 开心?solution: 网络最小费用流note: * 由于边费用1的不好处理,所以可以i先处理边费用为k的,再上面原创 2017-02-21 16:52:32 · 356 阅读 · 0 评论 -
hdu4780(*最小费用流)
/*translation: M台机器要生产n个糖果,遵循如下规则: 1.糖果i的生产区间在(si, ti),花费是k*(pi-si),pi是实际开始生产的时间 2.机器j从初始化到生产糖果i所需的时间Cij,花费是Dij 3.任意机器从生产糖果i到生产糖果j,需花费时间Eij,花费Fij 求生产完所有糖果所需的最小时间?solution: 最小费用流note: * 从s到每个原创 2017-02-21 16:51:35 · 354 阅读 · 0 评论 -
poj3422(*最小费用流)
/*translation: 一张图的每个坐标上都有一些数字,现要从左上角走到右下角,只能往右或者往下。每一步的得分会在原有 基础上加上坐标上的数字。并且之后把该坐标上的数字清零。求上述过程重复k次之后得分最大值是多少?solution: 最小费用流 很明显只要做一遍容量为k的最小费用流即可。但是难点在于如何满足条件:一个点可以走多次,但是值只能 算一次原创 2017-02-12 17:39:52 · 374 阅读 · 0 评论 -
poj3686(*最小费用流-转化成普通指派问题)
/*translation: 有n个订单要交给m个工厂完成。给出每个订单在每个工厂的完成时间。求一个最佳方案使得完成所有订单的平均时间最短。solution: 最小费用最大流 如果每个工厂只能完成一个订单的话,那就是指派问题了。跑一遍最小费用流即可。但是题目每个工厂可能完成多个。 所以需要将其拆点使得每个工厂只能完成一个订单,进而转换成指派问题。对一个工厂来说,原创 2017-02-11 12:36:49 · 1216 阅读 · 0 评论 -
poj2135(*最小费用最大流)
/*translation: 给出一张图,求从1~n再从n~1的最短路径是多少?注意同一条路径不能走两次!solution: 最小费用最大流 这个问题可以转化为求2条从1~n不相交的路径,进而就是直接求从1~n的流量为2的最小费用流。note: * 本质上是求从1~n的流量为2的最小费用流 # 不能直接用两次dijkstra来求。(将第一次走过的路删掉原创 2017-02-11 10:46:46 · 2213 阅读 · 2 评论 -
poj3680(*最小费用流)
/*translation: 见小白书p246solution: 最小费用流 对于一个区间,在a,b之间连上一条容量1,费用w的边,表示选中这个得到w。区间内部点之间i,i+1之间连上一条 容量无穷,费用0的边。每个a与s相连,容量1,费用0。每个b同理。这样建图之、后跑最小费用流即可。note: **/#include #include #inclu原创 2017-02-19 22:30:57 · 657 阅读 · 0 评论 -
hdu4411(#最小费用流)
/*translation: n个城市,从0出发,要遍历所有得城市。在访问城市i之前必须已经访问完所有j(j<i)得城市。现在最多有k 个人,求这k个人遍历完所有的城市所走的最小距离。solution: 最小费用流 添加源点、汇点。源点和0之间添加容量为k,费用0的边。0和汇点添加容量k,费用0的边(因为不必k个人全都用) 将每个点拆成i、i+n。i、i原创 2017-02-19 16:38:37 · 238 阅读 · 0 评论 -
poj3669(有坑的bfs,mdzz出题人系列)
/*translation: 一张二维平面的图,每个点可能遭到流星的轰炸,同时该点的上下左右四个点都被摧毁。 在该店被轰炸之后任何时间内不允许通过。一开始在原点处,求多久才能到达安全区域?solution: 多加了轰炸之后不能通过这一条件。就是按普通的广搜来,没难度。note: 1:打死出题人,WA了不知道多少发就是因为这SB出题人明明说了数据不会超过300,结果 在测试数据里来了原创 2016-10-23 16:24:43 · 432 阅读 · 1 评论 -
aoj2224(最大生成树)
/*translation: 给出一张图,令这张图没有闭合区域,问最少花费多少?每消去一条边的花费是这条边的权值。solution: 最小生成树 可以很容易证明要使得图中没有闭合区域的子图是该图的一个生成树。又要使得消去的边权值最小, 那么这个生成树肯定是最大生成树。note: *这道题虽然简单,但是可以总结出一个规律:即一个图的生成树必定没有环。date: 2016.10.2原创 2016-10-23 16:21:17 · 524 阅读 · 0 评论 -
uva10129
题目描述:http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=19492/*1:通常想法是将每个单词看成一个节点,但如果单词的尾部与另外一个单词的首部相同,就能架起一座“桥”,但这样以来,数组就开太大了 2:将每个单词的首尾两个字母看成节点,此时单词就是一座桥。这样就可以根据欧拉道路的出入度来判断 3:注意题中判断欧原创 2016-04-10 10:04:01 · 1088 阅读 · 2 评论 -
基本算法DFS以及BFS
图的深搜#include <iostream>#include <vector>#include <cstdio>#include <cstring>using namespace std;const int maxn = 100;int G[maxn][maxn], vis[maxn];int n, m;vector<int> ans;void dfs(int start) {原创 2016-04-09 19:53:38 · 1343 阅读 · 0 评论 -
uva10305
题目描述:http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=19494 下面给出刘汝佳的代码,但是个人觉得代码有点繁琐,后面又附上个人自己写的代码//尽量用if条件中不要包含if(flag[i] == 1)这样的语句;最好改为 if(flag[i])#include <iostream>#include <cstdio>#原创 2016-04-09 21:26:39 · 1466 阅读 · 3 评论 -
图的拓补排序基本算法
拓补排序很简单,就是一个图中存在(u, v)使得u必须在v之前遍历,而算法所要做的就是按照拓补顺序将图遍历。举例子,就像大学课程,某课程a是课程b的先修课程,即必须先学完a才能学b课程,而用拓补算法能够合理给出一个课程安排顺序。注意图中不能存在环,否则拓补排序将失败。基本算法如下:#include <iostream>#include <cstdio>#include <vector>#inc原创 2016-04-09 21:19:32 · 1552 阅读 · 0 评论 -
uva816
题目链接:http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=35521/* 1:将方向用数组来表示,可方便编写代码。 2:注意题意,初始状态是刚刚离开入口 3:注意输出的格式,最后如果不满10个坐标就结束记得换行*/#include <iostream>#include <cstdio>#inclu原创 2016-04-09 20:18:27 · 808 阅读 · 0 评论 -
uva11082
题目描述:http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=36866/*solution: 此题其实可以转换成最大网络流问题,可以想象每行是一个水管,每列也是一个水管。 把矩阵里的每个数都减少1,则A[i]减少c,B[i]减少r,每个元素范围变成0-19.假设每行对应 一个X,每列对应着一个Y,添加一个原创 2016-04-25 23:34:45 · 295 阅读 · 0 评论 -
uva753
题目描述:http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=26746/*solution: 节点表示插头类型,边表示转换器,然后使用floyd算法,计算出任意一种插头类型能否转换成另外一种插头类型。 额外添加一个源点s,从s到设备device[i]连接一条容量为1的边,再额外加一个汇点t,从插座target[i原创 2016-04-25 23:33:13 · 487 阅读 · 0 评论 -
uva10048
题目描述:http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=22156/*solution: 此题可以直接套上floyd算法的模板,但是要把加法改成max 对于任意一条至少包含两条边的路径,i->j,一定存在k使得i->j 噪音的最高级等于max(d[i][k]原创 2016-04-25 23:30:46 · 1018 阅读 · 0 评论 -
uva247
题目描述:http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=20840/*solution: 首先用floyd算法求出闭包,即g[i][j]表示i是否直接或者间接给j打过电话。 g[i][j] = g[j][i] = 1时二者处于同一个电话圈date: 2016/2/25*/#include <iostr原创 2016-04-25 23:29:22 · 444 阅读 · 0 评论 -
floyd算法
/*求出每两点之间的最短路径,多源最短路径solution: 该模板主要基于这样一个事实,对于任意一条至少包含两边的路径i->j,一定存在一个中间点k,使得i->j 的总长度等于i->k与k->j的长度之和。对于不同的点k,i->k和k->j的长度之和可能不同,最后还需要一个 最小值才是i->j的最短路径time: 2016/原创 2016-04-25 23:24:50 · 316 阅读 · 0 评论 -
Bellman-Ford算法
#include <iostream>#include <cstdio>#include <cstring>#include <queue>#include <vector>using namespace std;const int maxn = 100000 + 5;const int INF = 99999999;int d[maxn], cnt[maxn], n, m; //原创 2016-04-25 23:23:48 · 240 阅读 · 0 评论