![](https://img-blog.csdnimg.cn/20201014180756925.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
图论
文章平均质量分 78
AC_Arthur
Die luft der Freiheit weht
展开
-
UVA 1194 - Machine Schedule(最大流)
题目链接:点击打开链接思路:看这些约数条件和数据范围, 很容易联想到网络流。 我们如果把流量当作答案, 那么最小割等于最大流, 我们考虑如何构建最小割。 因为每个工作的顺序随意, 所以我们只需要调整到某一个模式一次即可。 那么我们用源点到模式的流量来限制, 容量为1, 把第二个机器的模式和汇点相连,容量为1, 这样, 对于每一个工作, 向两个机器连容量为1的边, 那么对于一个原创 2016-09-14 19:43:29 · 798 阅读 · 0 评论 -
UVA 11374 - Airport Express(最短路)
题目链接:点击打开链接题意:某个人要从起点到终点, 有m个经济站和k个商业站, 只能乘坐一次商业站, 求最短时间。思路:因为多了商业站, 所以不能直接套用最短路, 但是注意到只有一次乘坐商业站的机会, 所以直接枚举坐哪个商业站就行了, 这样,其他部分就是最短路了, 假设商业站是从a到b,花费c,那么答案就是d1[a] + d2[b] + c, d1是从起点的最短路,d2是从终点出发的最短路原创 2016-02-11 12:54:09 · 2395 阅读 · 2 评论 -
HDU 5624 KK's Reconstruction(最小生成树)
题目链接:点击打开链接题意:n个城市, m条可以修建的路, 修每条路有一个费用, 要求修建路将n个城市全部联通,并且最大费用减去最小费用最小。思路:枚举最小边, 然后重新求一遍最小生成树,复杂度m^2, 出的数据水了, 左边BC水过了。。细节参见代码:#include#include#include#include#include#include#include#in原创 2016-02-07 11:25:12 · 2660 阅读 · 0 评论 -
12661 - Funny Car Racing (最短路)
一道比较基础的最短路问题,和普通最短路的不同之处在于每条道路会开启a时间,关闭b时间的循环 。那么只需要在dijkstra算法中利用d[u]稍微改动一下就行了 。两种情况:1 可以直接通过该条道路 。 2 需要等一会才能通过 。 当然还有可能无论如何都不能通过 。 细节参见代码:#includeusing namespace std;typedef long long ll;原创 2015-08-23 09:21:55 · 1801 阅读 · 1 评论 -
1349 - Optimal Bus Route Design(二分图最小权完美匹配)
该题是一道典型的二分图最小权完美匹配问题 。每个点恰好属于一个有向圈,意味着每个点都有一个唯一的后继 。某个东西恰好有唯一的.....这便是二分图匹配的特点 。将每个结点拆成Xi和Yi,则原图中的有向边u->v对应二分图中的边Xu->Yv 。当流量满载时存在,存在完美匹配,否则不存在 。 网络流这类题目的难点在于将实际问题转化成理论模型,即建图过程 。 要想看出是二分图题目,就要明白这类题原创 2015-08-22 21:42:40 · 1851 阅读 · 0 评论 -
753 - A Plug for UNIX (最大流或二分图匹配)
紫书上网络流部分的第一道例题, 刚刚学了最大流,还没有理解二分图匹配 , 这里就只说一下我用最大流是怎么做的吧 。我们可以假想一个源点,一个汇点,然后对于每一个设备的插头,从源点连一条线,对于每个插座,连一条线到汇点,且容量都为1 。原创 2015-08-20 18:47:03 · 947 阅读 · 0 评论 -
HDU 2489 Minimal Ratio Tree(最小生成树)
该题就是最小生成树算法的变形,由于这个比值没有什么规律,不可能一下子算出最小情况,我们可以很容易发现,结点数非常少,所以我们可以枚举出m个结点的所有组合,这样,结点权值只和就确定了,为了使得比值最小,那么就要使得边权值之和最小,也就是最小生成树模板了。枚举n个数中的m个可以有两种方法: dfs和二进制枚举子集。该题我用的二进制,感觉比较方便。细节参见代码:#include#inc原创 2015-09-06 21:09:56 · 583 阅读 · 0 评论 -
11082 - Matrix Decompressing (网络流建模|二分图匹配)
该题是一道经典的二分图匹配的题目 。现在终于有点明白什么是二分图匹配了,其实说白了就是依赖于最大流算法之上的一种解决特定问题的算法 。 所谓二分图,就是我们假定有两个集合A和B,每个集合中有若干元素(点),其中源点与A相连,汇点与B相连,并且他们的总容量决定了最终答案的上限,所以一定要维护好 。 然后由A中的点向B中的点连线,他们之间也有一定的容量制约关系(具体看题目中的边权值限制)。这样就可以求原创 2015-08-20 21:06:36 · 1081 阅读 · 0 评论 -
HDU-1533 Going Home(二分图匹配)
最近开始做最小费用流的题目,该题是二分图完美匹配下的最小权匹配,所谓完美匹配就是说从源点流入的总流量等于从汇点流出的总流量,在这种状态下的最小费用 。 那么显然是要套用最小费用流模板,另外二分图匹配的第一步就是要划分集合,划分两个集合,集合A与源点相连,集合B与汇点相连,至于容量和权值就要依据题目而定 。比如该题,因为每个小人恰好能对应一个房子,所以每个小人与汇点的容量为1,房子与汇点的容原创 2015-08-21 10:32:31 · 872 阅读 · 0 评论 -
HDU-4081 Qin Shi Huang's National Road System(最小生成树)
今天比赛AC的一道最小生成树的题目 , 学到了不少东西 。 最小生成树的模板很简单,最简洁好写的还是lrj紫书上的代码 。利用并查集加速算法 。该题的不同之处在于它选择任意一条路修成“魔法”道路 , 然后其他路的权值之和还要是最小的一棵次小生成树,并且求魔法道路两端点值之和除以其他路径长之和的最大值 。显然该题的难点在于枚举两个端点之后怎么快速的求出次小生成树权值之和 。 枚举两个端原创 2015-08-19 19:49:47 · 972 阅读 · 0 评论 -
HDU 1217 Arbitrage(Flody)
Flody的变形,初始化所有d[i][i] = 1,其他为0。 这样在Flody的时候取大就行了。 然后检查所有点d[i][i]是否有大于1的。细节参见代码:#include#include#include#include#include#include#include#includeusing namespace std;typedef long long ll;原创 2015-09-07 20:53:50 · 533 阅读 · 0 评论 -
658 - It's not a Bug, it's a Feature! (Dijkstra算法)
今天第一次系统的学习了一下最短路算法,开始刷第十一章,第一次写Dijkstra算法,出现了很多喜闻乐见的错误。。而且uva上样例很水,瓢虫也很水 ,坑了我好久。首先是对于结点的处理,我们必须要维护一个二元组,一个表示结点一个表示当前结点最短路。 因为Dijkstra算法利用了优先队列来加速算法,所以需要定义小于运算符,一开始我直接将状态装进了优先队列,显然是不对的,因为优先队列的作用就是取原创 2015-08-17 21:53:13 · 839 阅读 · 0 评论 -
UVA 10917 - Walk Through the Forest(最短路优化DP)
题目链接:点击打开链接题意:给你一个图, 从1走到2,求有多少种不同的走法,从结点a可以走到b的条件是:存在一条总b出发回家的路径,比从a出发回家的路径都短。思路:这个条件的意思其实就等价于从2到b的最短路比从2到a的最短路短。所以, 可以事先处理出从2出发到所有结点的最短路。 然后用DP进行计数就行了。细节参见代码:#include#include#include#in原创 2016-02-11 13:34:49 · 2314 阅读 · 0 评论 -
UVA 10816 - Travel in Desert(最小生成树+最短路)
题目链接:点击打开链接题意:有n个绿洲, m条道路,每条路上有一个温度,和一个路程长度,从绿洲s到绿洲t,求一条道路的最高温度尽量小, 如果有多条, 选一条总路程最短的。思路:先生成最小生成树,按照温度排序, 当s和t联通的时候, 这个温度就是最高温度。 然后把其他温度小于等于这个温度的道路也加进图中, 跑一个最短路就行了。细节参见代码:#include#include#in原创 2016-02-16 15:13:49 · 1467 阅读 · 0 评论 -
POJ 3422 Kaka's Matrix Travels(费用流)
题目链接:点击打开链接思路:我们用流量来限制走的次数, 因为权值在结点上, 我们考虑拆点, 因为每个点的权值只能获得一次, 我们对于每个点连两条边, 一条容量为1费用为权值, 一条容量为k-1,费用为0, 跑最大费用流就行了。细节参见代码:#include #include #include #include #include #include #include #原创 2016-09-14 12:50:15 · 539 阅读 · 0 评论 -
Codeforces Round #360 (Div. 1) A. NP-Hard Problem(二分图染色)
题目链接:点击打开链接思路:根据题目描述, 就是找两个不相交点集使得对于每一条边至少有一个顶点在点集中, 那么显然对于每条边必须是一个点在A集合, 一个点在B集合, 即二分图染色裸题。WA了一次, 因为有可能存在好几个连通图。细节参见代码:#include #include #include #include #include #include #include #i原创 2016-07-06 15:18:36 · 1462 阅读 · 0 评论 -
UVA 11324 - The Largest Clique(SCC缩点 + DP)
题目链接:点击打开链接思路:如果没有环, 该题就是DAG上最长路, 现在有环, 我们把强连通分量缩点, 那么缩点之后的图就是一个DAG, 可以用DP求解, 用d[i]表示以i结尾的最长路距离。细节参见代码:#include #include #include #include #include #include #include #include #include #原创 2016-05-18 22:09:31 · 2884 阅读 · 0 评论 -
HDU 3836 Equivalent Sets(强连通分量)
题目链接:点击打开链接思路:强连通分量模板题, 把一个强连通分量的缩成一个点, 构建一张新图。 然后在新图上, 求每个点的入度和出度。 假设有a个顶点的入度为0,b个顶点的出度为0,那么可以证明答案就是max(a, b)。 可以这么想, 入度为0的点肯定要练到出度为0的点。细节参见代码:#include #include #include #include #include原创 2016-05-17 20:57:05 · 3303 阅读 · 0 评论 -
POJ 3678 Katu Puzzle(2-SAT)
题目链接:点击打开链接思路:2-SAT基础题, 关键是要理解好模板的含义,然后重点在建图。在2-SAT中, 问题的关键是处理矛盾关系, 找到一个可行的解满足所有关系。 然后我们建图的时候, 连接一条有向边, 这条有向边可以理解成导出关系, a -> b。 那么我们可以由此来建立关系运算符, 以AND操作, 如果AND操作为真, 那么!a -> a, !b -> b, 代表, 如果a为假原创 2016-04-11 21:01:14 · 828 阅读 · 0 评论 -
POJ 2446 Chessboard(二分图匹配)
题目链接:点击打开链接题意:给你一个n*m的棋盘, 上面有一些洞洞,要求放置若干1*2的木板, 洞洞位置不能放置, 其他位置要全部覆盖, 任意一个格子不能同时覆盖两块木板, 求能否完全覆盖。思路:二分图匹配。 相邻两个格子, 行数 + 列数 一定是一个奇数一个偶数, 由此将格子分成两派, 匹配一些即可。 可以用最大流, 但是匈牙利算法更快, 而且代码短。细节参见代码:#inclu原创 2016-04-07 11:28:02 · 2501 阅读 · 0 评论 -
POJ 3680 Intervals(最小费用流)
题目链接:点击打开链接题意:n个区间, 每个区间有一个值, 让你选择若干区间, 使得没有一个点被覆盖超过k次的前提下的最大值。思路:我们可以把区间端点离散化然后跑费用流, 不超过k次, 我们可以把这个对应流量属性。 那么不难想到, 将区间端点作为结点, 连一条流量为1,费用为-a[i].c的边, 因为可以跳过一些点, 所以我们把每个相邻端点之间用流量INF,费用为0的边连接, 然后源点流原创 2016-03-24 14:53:56 · 1249 阅读 · 0 评论 -
POJ 2513 Colored Sticks(hash + 欧拉道路)
题目链接:点击打开链接题意:n个木棍, 两端有颜色, 相同颜色可以链接, 问你最终能否形成一条线段。思路:典型的欧拉道路, 成立的条件是 1. 图联通 。 2. 度为奇数的点不能超过2个。 用map超时了, 可以用hash水过去。细节参见代码:#include#include#include#include#include#include#include#includ原创 2016-04-05 22:32:39 · 1540 阅读 · 0 评论 -
POJ 3164 Command Network(最小树形图)
题目链接:点击打开链接题意:给你一个图 (单向边), 要求你找到一棵树, 根结点是1, 可以从根结点到达其他任意一个结点, 且总权值最小。思路: 模板题。细节参见代码:#include#include#include#include#include#include#include#include#include#include#include#include原创 2016-03-18 16:56:46 · 651 阅读 · 0 评论 -
HDU 4126 Genghis Khan the Conqueror(最小生成树)
题目链接:点击打开链接题意:给你一张图, n个点, m条边, 求一个最小生成树, 然后Q个询问, 每个询问要求改变一条边, 然后求现在的最小生成树。思路:最暴力的做法是, 对于每个询问, 改变这个边(一定是增大)之后再做一遍最小生成树。 复杂度O(qm),显然会超时。 那么我们可以发现, 对于每个询问推一步的结果如下:1. 改变的这条边不在最小生成树中, 那么答案就是最小生成树。2原创 2016-03-05 15:41:02 · 1248 阅读 · 0 评论 -
POJ 2253 Frogger(最小生成树)
题目链接:点击打开链接题意:求从1到2的路径中, 使得最长路尽量小。细节参见代码:#include#include#include#include#include#include#include#include#include#include#include#include#include#include#include#define Max(a,b) (原创 2016-03-05 10:20:24 · 1366 阅读 · 0 评论 -
POJ 1815 Friendship(最小割+拆点法)
题意:求拆除几个点可以使得s和t不连通。典型的最小割问题,不过该题不是删除边而是删除点,又是结点容量问题,所以我们用拆点法来解决 。 对于最小割问题,也做了不少了,说说我的理解吧: 就是通过最大流算法,让两部分不连通的最小流量,所以我们可以将割裂一个点的费用表示成容量,像该题,我们要拆掉一个人,那么让结点容量为1就好,至于其他的边,因为与边无关,所以设为INF 。 该题的难点在于要原创 2015-09-01 20:29:55 · 999 阅读 · 0 评论 -
821 - Page Hopping (Floyd)
很裸的Floyd水题,只需要注意一点: 题目中给的结点编号并不是完整的从1~n,不过没有关系,因为我们初始化为INF,当两点间距离不等于INF时相加就可以了。细节参见代码:#includeusing namespace std;const int maxn = 105;const int INF = 1000000;int a,b,n,d[maxn][maxn],kase = 0原创 2015-08-18 09:51:19 · 882 阅读 · 0 评论 -
1001 - Say Cheese (Dijkstra算法)
该题是求两点间的最短路问题,用Dijkstra算法比较快 ,跑了0.003s 。方法很简单,将圆看成结点,直接判断两个圆是否相交,如果相交距离为0,否则距离为圆心间距离减去两圆半径。 起点和终点也可以看成是一个半径为0的圆 。这样就变成了两点间的最短路问题,适合用Dijkstra算法求解。 比较坑的是该题说了数据范围n最大100,但是我开了105竟然RE ,看成505就过了 。 所以在原创 2015-08-18 12:58:09 · 829 阅读 · 0 评论 -
UVA 1664 - Conquer a New Region(并查集)
该题巧妙的运用了并查集,运用了类似于最小生成树算法的过程 ,通过该题可以对并查集有一个更深的理解 。 由于i和j唯一通路上容量的最小值为该两点的容量,求一个点到其他所有点的容量最大值 。首先,解决两点的容量问题 ,我们将所有边从大到小排序,然后从大到小枚举,我们假设根结点就是要找的城市中心点,那么当又加入一条边时,该边的两个顶点所在的集合设为A、B,集合A、B的顶点a、b,要让谁当中心点呢原创 2015-08-24 21:13:21 · 1430 阅读 · 0 评论 -
1660 - Cable TV Network(最大流最小割)
该题又是一道经典的最小割问题,不过不是割边而是割点 。问题是:最少删除几个点可以让图不连通 。 我们都知道最大流对应着最小割,所以重点在于建模 。为了形成割,那么必须让点具有“流量”的性质,怎么做呢? 对,拆点 。 和例题1658类似的方法,我们将每个点拆成两个点,连一条容量为1的边,那么每个点就被赋予了流量的性质,这次我们反而要令边的容量为无穷大,因为要删除点而不是边 。 另外因为我们不原创 2015-08-24 10:31:19 · 1578 阅读 · 0 评论 -
HDU 4786 Fibonacci Tree(最小生成树)
该题其实就是最小生成树的变形,先求一个最小生成树的权值,再求一个最大生成树的权值,显然在这两个权值之间的所有值都可以取到(你总可以拿一条黑边换成一条白边)。那么我们只要看一下这些值中有没有斐波那契数就行了。小于100000的斐波那契数只有几十个,直接枚举就行了 。 细节参见代码:#include#includeusing namespace std;typedef long long原创 2015-08-25 09:23:43 · 979 阅读 · 0 评论 -
UVA 10801 - Lift Hopping (Dijkstra算法/最短路)
比较简单的最短路问题,唯一的不同是更换电梯的时候需要多加60s等待时间,而且第一次上电梯不需要等待60s 。注意到这些细节之后在结构体中多保存一个电梯的id,这样在松弛操作的时候分情况讨论一下就行了 。细节参见代码:#includeusing namespace std;const double INF = 1000000000;const int maxn = 505;int n原创 2015-08-23 21:38:04 · 900 阅读 · 0 评论 -
820 - Internet Bandwidth(最大流模板题)
最大流裸题,紫书上的图有问题,差点坑到我。。给出Dinic算法模板,比较高效的最大流算法,复杂度为O(v^2*E),而实际上Dinic算法比这个理论界要好得多。 紫书上的Edmonds-Karp算法的复杂度是O(v*E^2),对于边较多的题目来说显然不够高效。细节参见代码:#includeusing namespace std;typedef long long ll;const原创 2015-08-23 19:57:14 · 1045 阅读 · 0 评论 -
1515 - Pool construction(最大流最小割模型)
该题是一道经典的最小割题目 。 最近学习图论以来一直不是很明白最小割是什么,通过该题,有了一定的认识 。首先我们要知道最大流最小割定理 :对于任意一个只有一个源和一个汇的图来说,从源到汇的最大流等于最小割 。也就是说,对于一个图中的两个集合AB,通过删除一些边让他们恰好不连通,那么删掉的这些边就叫做他们的割了 。 那么最小割和网络流有什么关系呢? 为什么最小割定理是对的呢? 其实很简单原创 2015-08-23 17:10:08 · 1382 阅读 · 0 评论 -
Out of Hay.(POJ-2395)
最小生成树kruskal算法。首先必须形成一棵最小生成树,然后找出最长的路。#include#include#include#include#include#include#includeusing namespace std;int n,m,a,b,c,par[1005],rankk[1005], max_road;struct edge { int u,v,c原创 2015-05-01 10:33:19 · 995 阅读 · 0 评论 -
Bad Cowtractors.(POJ-2377)
最大生成树,只需要变一下改变值的部分就可以了。尝试了一下运用并查集的kruskal算法,与prim相比各有利弊吧,还要根据数据特点适当选取。#include#include#include#include#include#include#includeusing namespace std;int n,m,a,b,c,par[1005],rankk[1005];struc原创 2015-05-01 10:08:02 · 844 阅读 · 0 评论 -
Agri-Net.(POJ-1258)(最小生成树)
最小生成树算法。#include#include#include#include#include#includeusing namespace std;const int INF = 1000000000;int cost[105][105];int mincost[105];bool used[105];int n,a;int prim() { for(int原创 2015-04-30 20:22:54 · 1283 阅读 · 1 评论 -
Silver Cow Party.(POJ-3268)
本来想用Floyd算法,可惜超时,毕竟复杂度太高,而且并没有必要求出任意两点间的最短距离。求两点间的最短路有两种方法,dijkstra和Bellman ,前者不能有负圈,后者可以有负圈,另外,Floyd也可以求带负圈的最短距离。我们只需要求出x到其他个点的最短距离和个点到它的最短距离就行了。当然,我所写的还求了很多多余的量,是可以优化的。#include#include#inclu原创 2015-04-30 19:43:00 · 811 阅读 · 0 评论 -
Wormholes.(POJ-3259)
最短路Bellman的算法,只需用到判断是否存在负圈的部分,因为只要存在负圈,则一定有一条路可以返回起点并且时间还原(一开始题意理解的不好,注意如果返回起点的时间为负数,其实也是可以的,应该是默认了返回起始时间,因为时间不能为负。) 所以,实质就是判断是否存在负圈。#include#include#includeusing namespace std;const int INF =原创 2015-04-29 17:34:26 · 1000 阅读 · 1 评论 -
HDU 4687 Boke and Tsukkomi(一般图匹配|带花树)
比赛的时候刚开始看这题还以为是二分图匹配,后来才发现根本不是,因为该题存在长度为奇数的圈 。 比如1->2,2->3,3->1 。 所以该题要用一般图匹配,即带花树算法 。比赛时抄的模板有地方抄错了,上述样例出现了死循环 。 赛后补题的时候用map去重却得不到正确答案,不知为何,暂放 ,下面给出一种正确解法。 细节参见代码:#include#include#include#原创 2015-08-26 20:52:46 · 1033 阅读 · 0 评论