随笔分类 -  图论

PAT 1013Battle Over Cities
摘要:本题注意解题要点就是需要添加的边数就是删除对应点之后的连通块数减一。然后用dfs求出连通块数目然后将其减一即可。 参考代码如下: 阅读全文
posted @ 2019-09-04 12:20 sapphirebitter 阅读(118) 评论(0) 推荐(0)
PAT 1003 Emergency(Dijstra算法解决)
摘要:1003 Emergency (25 分) 1003 Emergency (25 分) 1003 Emergency (25 分) As an emergency rescue team leader of a city, you are given a special map of your co 阅读全文
posted @ 2019-09-02 15:03 sapphirebitter 阅读(550) 评论(0) 推荐(0)
Calling Circles(UVa 247)(Floyd 算法)
摘要:用Floyd算法求出传递闭包,然后用dfs求出每条连通分量。注意其中用到的几个小技巧: 阅读全文
posted @ 2018-03-08 21:34 sapphirebitter 阅读(155) 评论(0) 推荐(0)
Floyd(求每2个点之间的最短路)
摘要:稍微改变即可求传递闭包,即关心两点之间是否有同路: 阅读全文
posted @ 2018-03-07 20:00 sapphirebitter 阅读(453) 评论(0) 推荐(0)
Bellman-Ford算法(在边权可正可负时求最短路)
摘要:使用FIFO队列实现: 阅读全文
posted @ 2018-03-05 20:27 sapphirebitter 阅读(188) 评论(0) 推荐(0)
Buy or Build(UVa1151)
摘要:如果枚举每个套餐,并每次都求最小生成树,总时间复杂度会很高,因而需要先求一次原图的最小生成树,则枚举套餐之后需要考虑的边大大减少了。 具体见代码: 阅读全文
posted @ 2017-11-28 20:14 sapphirebitter 阅读(213) 评论(0) 推荐(0)
Keuskal算法模板
摘要:int cmp(const int i, const int j) { return w[i]<w[j]; }///间接比较函数,w[i]表示边i权值 int find_set(int x) { return p[x] == x ? x : p[x] = find_set(p[x]);} int Kruskal(){ int ans = 0; for (int i =... 阅读全文
posted @ 2017-11-22 22:21 sapphirebitter 阅读(204) 评论(0) 推荐(0)
公共表达式消除(UVa 12219)
摘要:紫书354页的题,将表达式树进行公共表达式消除,化为等价的图。因为需要判断某一个是否出现过,所以需要快速比较,采用哈希表的形式,将a~b与1~27一一对应,不采用0,因为0与0000是相同的,对于每一个树,都预先给予其一个编号,然后将其所表示的字符串化为27进制的数,然后递归建造其左右子树,如果发现 阅读全文
posted @ 2017-11-22 19:56 sapphirebitter 阅读(1617) 评论(0) 推荐(0)
无根树转有根树模板
摘要:vector G[maxn]; void read_tree(){ int u,v; scanf("%d",&n); for(int i = 0; i < n-1; i++){ scanf("%d%d",&u,&v); G[u].push_back(v);///输入u相邻的点v G[v].push_back(u); ... 阅读全文
posted @ 2017-11-15 20:55 sapphirebitter 阅读(168) 评论(0) 推荐(0)
Dijkstra(迪杰斯特拉)模板
摘要:直接将模板封装在结构体里面。 阅读全文
posted @ 2017-10-23 20:18 sapphirebitter 阅读(554) 评论(0) 推荐(0)
<<操作,&0xff以及|的巧妙运用(以POJ3523---The Morning after Halloween(UVa 1601)为例)
摘要:<<表示左移,如a<<1表示将a的二进制左移一位,加一个0,&0xff表示取最后8个字节,如a&0xff表示取a表示的二进制中最后8个数字组成一个新的二进制数,| 运算符表示对2个数的二进制位进行比较,只要2个之中有一个这个位是1,则2者进行或运算之后得到的那个二进制数相应的位也是1。 因此,可以将 阅读全文
posted @ 2017-08-30 17:15 sapphirebitter 阅读(222) 评论(0) 推荐(0)
拓扑排序
摘要:DFS法寻找: 首先创建一个数组G,保存每个连通线,然后进行拓扑排序,拓扑排序中需要创建一个数组判断是否有前驱,以及是否形成了有向环,如果形成有向环就不能进行拓扑排序,然后通过DFS查找前驱,同时查找的过程中不能出现正在递归的变量,如果出现便说明有有向环,递归结束之后把判断数组标记为已递归,然后把变 阅读全文
posted @ 2017-07-31 16:19 sapphirebitter 阅读(163) 评论(0) 推荐(0)