![](https://img-blog.csdnimg.cn/20201014180756923.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
大白书-第5章-图论算法与模型
文章平均质量分 77
冷月残星
这个作者很懒,什么都没留下…
展开
-
bfs(大火蔓延的迷宫,UVA 11624)
一开始WA了,因为以为只有一个火源,其实有多个(portions)。真的需要加强英语阅读能力了。解法:这就是一个加了一些限制条件的迷宫问题,限制条件是迷宫会着火,随着时间的推移火会蔓延,仔细思考就会发现每个格子着火的时间是固定而且有迹可循的,如果能预处理出每个格子着火的时间,那么问题就已经解决了(只需要在bfs扩展节点时判断一下即可,如果着火了就当做墙,否则就可以扩展)。那么该怎么原创 2017-02-07 12:34:12 · 592 阅读 · 0 评论 -
Dijkstra,最短路树(战争和物流,LA 4080)
学会了最短路树。#include#includeusing namespace std;typedef long long ll;const ll maxn = 110;const ll maxm = 1010;const ll inf = LONG_LONG_MAX>>2;struct Edge{ ll from,to,dist;};struct He原创 2017-02-10 12:48:29 · 821 阅读 · 0 评论 -
Bellman-Ford,最短路(在环中,UVA 11090)
给你一个边权为正的有向图,节点数最多50个。问你平均长度最短的圈的平均长度是多少。如果没有就输出没有,有就输出具体数值。显然圈有很多,每个圈的长度也有很多。最简单的思路就是找到所有长度,或者所有最短长度,然后从中挑一个最小的就好了,但是好像没有什么算法能找到所有圈以及他们的所有长度或最短长度的。我最多知道如何判断一个图中有没有圈,而且这样的算法还不少。比如dfs,Floyd判圈法,Bellma原创 2017-02-11 15:34:25 · 280 阅读 · 0 评论 -
差分约束(Halum操作,UVA 11478)
大白书上的题目翻译经常出错,比如这次大于0翻译成了非负。本来可以一次AC的东西多花了我2小时。代码#include#define rep(i,a,b) for(int i=a;i<=b;i++)using namespace std;const int maxn = 550;const int maxm = maxn*maxn;struct Edge{ int原创 2017-02-11 18:39:45 · 295 阅读 · 1 评论 -
Dijkstra,最短路(蒸汽式压路机,LA 4128)
任何问题的最短路都是状态的最短路。代码#include#include#define rep(i,a,b) for(ll i=a;i<=b;i++)using namespace std;typedef long long ll;const ll maxn = 110;const ll inf = LONG_LONG_MAX>>2;ll dr[4]={-1, 0,原创 2017-02-11 20:15:11 · 383 阅读 · 0 评论 -
Dijkstra(低价空中旅行,LA 3561)
任何最短路的本质都是状态的最短路。其中涉及状态的定义以及状态的转移。当然你也可以用图论对状态建模,然后再跑普通的Dijkstra。代码#include#define rep(i,a,b) for(int i=a;i<=b;i++)using namespace std;const int maxn = 5000;const int inf = 0x3f3f3原创 2017-02-12 10:46:49 · 405 阅读 · 0 评论 -
Dijkstra,平面图最大流(动物园大逃亡,LA 3661)
学会了用最短路求平面图的最大流。http://blog.sina.com.cn/s/blog_60707c0f01011fnn.html代码#include#define rep(i,a,b) for(ll i=a;i<=b;i++)using namespace std;typedef long long ll;const ll maxn = 2e6;con原创 2017-02-12 12:41:20 · 461 阅读 · 0 评论 -
Kruskal,次小生成树,最小瓶颈路(秦始皇修路,LA 5713)
#include#define rep(i,a,b) for(int i=a;i<=b;i++)using namespace std;const int maxn = 1010;const int maxm = maxn*maxn;int n,m;vectorG[maxn];vectorW[maxn];int u[maxm],v[maxm];double w[maxm];i原创 2017-02-12 15:03:49 · 622 阅读 · 0 评论 -
Kruskal,最小生成树,树链剖分,LCA(邦德,UVA 11354)
又是最小生成树+树链剖分的经典组合题。代码#include#define ls (now<<1)#define rs (ls|1)using namespace std;const int maxn = 50010;const int maxm = 100010;int n,m;vectorG[maxn];vectorW[maxn];int u[maxm],v[原创 2017-02-12 18:11:26 · 362 阅读 · 0 评论 -
Dijkstra,记忆化搜索(林中漫步,UVA 10917)
就是先对终点求一个单源最短路,然后再对起点跑一个记忆化搜索。一开始搞错家和公司的位置了。。。卒。。。如果没AC,别太发牢骚,一定是你哪里没做好了。如果不用心,啥都做不好的。代码#include#includeusing namespace std;typedef long long ll;const ll maxn = 1010;const l原创 2017-02-10 10:33:46 · 388 阅读 · 0 评论 -
Dijkstra(机场快线,UVA 11374)
#includeusing namespace std;const int maxn = 1010;const int inf = 0x3f3f3f3f;struct Edge{ int from,to,dist;};struct HeapNode{ int d,u; bool operator < (const HeapNode& rhs) const原创 2017-02-09 21:40:13 · 295 阅读 · 0 评论 -
2-SAT问题(宇航员分组,LA 3713)
一共有三种任务,但是每个宇航员只能在其中某两种中选择一种。满足2-SAT模型的建模以及算法原理。(即每个人只能二选一)有向边uv表示选了u就要选v,这是一种限制而不是要求,所以我们依然可以把互相厌恨的条件满射成某些有向边。剩下的区别就只是搜索的时候加多一些讨论罢了。(比如dfs的失败条件不再是已经标记了另一个任务,而是另两个任务。)防止精度问题可用乘法判断。代码#i原创 2017-02-09 20:03:58 · 292 阅读 · 0 评论 -
bfs(独轮车,UVA 10047)
几个需要注意的地方:①向左转我用d=(d-1)%4,这是错误的,当d=0时d会变成-1,应该用d=(d+3)%4才对。②关于坐标方面的问题,我们在程序实现的时候更喜欢用行与列的概念,而在数学上我们更喜欢用x轴与y轴的概念。但是事实上行是对应y,列是对应x,如果不注意的话很容易就混用了,混用的话会且只会搞错方向。具体解决办法也很简单,把x与y或行与列互换一下即可。或者你干脆别用xy轴的概念就原创 2017-02-07 14:08:57 · 415 阅读 · 0 评论 -
欧拉回路(项链,UVA 10054)
看来自己的知识水平还是很低的,需要更多的更大量的学习才行。很容易想到建边图找欧拉回路。然后死于不会找欧拉回路。存在欧拉回路==从任意一点出发都能找到欧拉回路!=随便走都能走出欧拉回路。因为走着走着出现了桥这种东西,就不能随便走了,如果走了就一去不复还了。尝试用随便走+贪心,但是没法解决的。记得以前在《算法与数据结构》上看到要先找桥,然后如果不是万不得已就原创 2017-02-07 15:51:32 · 289 阅读 · 0 评论 -
拓扑排序(猜序列,LA 4255)
看来自己图论建模的功底还不够。百度百科说图论〔Graph Theory〕是数学的一个分支。它以图为研究对象。图论中的图是由若干给定的点及连接两点的线所构成的图形,这种图形通常用来描述某些事物之间的某种特定关系,用点代表事物,用连接两点的线表示相应两个事物间具有这种关系。可见图论是将事物建立关系的数学模型。因此想要利用图论建模,首先就要发现问题中的事物与关系。原创 2017-02-07 18:22:27 · 574 阅读 · 0 评论 -
双连通分量,二分图(圆桌骑士,LA 3523)
#include#define rep(i,a,b) for(int i=a;i<=b;i++)using namespace std;const int maxn = 1010;int pre[maxn],iscut[maxn],bccno[maxn],dfs_clock,bcc_cnt;vectorG[maxn],bcc[maxn];struct Edge{ int原创 2017-02-08 16:37:23 · 683 阅读 · 0 评论 -
双连通分量(井下矿工,LA 5135)
代码#include#define rep(i,a,b) for(ll i=a;i<=b;i++)using namespace std;typedef long long ll;const ll maxn = 100010;struct Edge{ ll u,v; Edge(ll u,ll v):u(u),v(v){}};stackS;ll pre[ma原创 2017-02-09 14:18:38 · 393 阅读 · 0 评论 -
强连通分量(等价性证明,LA 4287)
就是找到所有强连通分量然后缩点,得到DAG。设a为DAG入度为零的点的个数,b为DAG出度为零的点的个数。答案就是max(a,b)当DAG只有一个点时特判输出0。注意一些细节,就是缩点建图时不但要判断边的两端是否在同一个强连通分量内,还要判断是否已经使用过(即避免重边)。还有一些手误,以后应该注意。代码#include#define rep(i,a,b原创 2017-02-09 16:25:53 · 363 阅读 · 0 评论 -
强连通分量,DAG上的最长路,记忆化搜索(最大团,UVA 11324)
一点手误,搞WA了。。。代码#include#define rep(i,a,b) for(int i=a;i<=b;i++)using namespace std;const int maxn = 1010;const int maxm = 50010;int pre[maxn],lowlink[maxn],cnt[maxn],sccno[maxn],dfs_clock原创 2017-02-09 17:57:47 · 484 阅读 · 0 评论 -
2-SAT问题(飞机调度,LA 3211)
。。。代码#include#define rep(i,a,b) for(int i=a;i<=b;i++)using namespace std;const int maxn = 2010;struct TwoSAT{ int n; vectorG[maxn<<1]; int mark[maxn<<1]; int s[maxn<<1]原创 2017-02-09 18:53:18 · 596 阅读 · 0 评论 -
朱刘算法,二分法(比赛网络,UVA 11865)
最小值最大 =====> 二分法二分最小宽带值m,建图,图中的有向边宽带值均不小于m。然后跑朱刘算法,如果无法建图或者花费过高,那么就放宽条件(减小最小宽带值),如果条件无限宽还不行(m==1),那就不可能了,否则输出结果。朱刘算法模板:http://blog.csdn.net/leolin_/article/details/6751867原创 2017-02-12 21:19:37 · 227 阅读 · 0 评论