
图论
文章平均质量分 76
Neutralzz
这个作者很懒,什么都没留下…
展开
-
HDU2473 并查集的删除
思路参考的别人的题解~在删除结点的时候要注意这样的问题: 并查集的结构是一棵树,当把某一个结点删去(将其父结点置为自己)时,它的子结点的根就会丢失.因此,在删除某结点的时候,要确定它的所有子结点都已经并到根上了.解决方法: 为每一个结点加一个虚根,这样每个结点都是叶子结点.插入结点时,把它们都并到虚根的集合中.删除结点时,只要把它的父结点置为一个无用的虚根。。。。下面贴自己原创 2015-06-04 16:21:42 · 492 阅读 · 0 评论 -
HDU 3873 带保护节点的最短路
其实这个题一点都不难,然而我WA了一天。。。因为unidirectional是单向的!。。。原谅我英语渣。。。思路:优先队列里维护未保护的节点,不断求Dijkstra,对于被保护的节点,开一个pro数组 记录某节点的所有保护它的节点的最晚被占领的时间,当该节点的所有保护它的节点都被攻占时,dis[i] = max(dis[i],pro[i]),此时i节点也可入优先队列了。#incl原创 2015-06-08 23:34:38 · 306 阅读 · 0 评论 -
HDU 2433 Travel 最短路应用
题意:有n个点,m条边,求依次删除每一条边后所有两点之间的最短路径的和。思路:先以每一个顶点为源点求一遍最短路,这样就形成了n个最短路树,第i个树的边权和为sum[i]。然后枚举删除每一个边,分别以边上两点u、v为源点求最短路,如果u、v的距离发生变化,则以u为源点时,v节点下的子树的dis[i]都会变化,因边是双向的,i到u的距离也一样会发生改变(以v为源点时情况是一样的)。那么,以u、v为原创 2015-06-09 17:25:24 · 292 阅读 · 0 评论 -
HDU 2833 Floyd应用
好题!!先用floyd求任意两点间的最短路,然后有maps[u][i] + maps[i][j] + maps[j][v] = maps[u][v]。枚举i、j。#include#include#include#includeusing namespace std;const int maxn = 305;const int inf = 1e8 + 5;int n,m,u1,转载 2015-06-10 09:10:13 · 289 阅读 · 0 评论 -
Codeforces 567E President and Roads (最短路 好题)
题意:给你一个有向图和起终点s,t,问对于每一条边,1.是不是一定在s-t的最短路径上,如果是,输出“YES”2.如果不是,将边权减少多少,能让它一定在最短路径上,边权必须大于0,如果可以,输出‘CAN’ 并输出前后的边权差3.如果不能,输出‘NO’思路还是很简单的,从s和t做两次dijstra求出最短路dis[0][v],dis[1][v],在过程中同时记录下从起点到该点原创 2015-08-10 12:14:09 · 667 阅读 · 0 评论 -
HDU 5294 Tricks Device (最短路变体) 2015多校联合第一场
第二个答案很好求,求出最短路进过的最少的边数 和总数作差就是了。关键是第一问,我的做法是记录最短路的所有路径,然后从终点出发,开始搜索,经过的边进行标记,标记了的边不能再访问,如果能到达起点,结果+1。我的代码:#include#include#include#include#include#includeusing namespace std;typedef原创 2015-07-23 19:20:24 · 320 阅读 · 0 评论 -
Codeforces 650C Table Compression (并查集+拓扑排序)
解析:不看tags都意识不到用图论。一个位置对应一个节点,对于每行每列,值相同的用并查集union一起,值不相同的,值小的节点指向值大的节点。压缩后节点的值是到该节点的最长的链的长度,可以通过拓扑排序求得。[code]:#include#include#include#includeusing namespace std;const int maxn = 1e6原创 2016-05-31 16:14:30 · 333 阅读 · 0 评论 -
Codeforces 659F Polycarp and Hay (排序+并查集)
解析:将所有的cell按高度从大到小排序,然后每次放入值相同的cell,用并查集维护集合和集合大小,并判断是否满足条件即可。找到后搜索标记所有的位置。[code]:#include#include#include#include#include#define lson l,mid,rt<<1#define rson mid+1,r,rt<<1|1#define lowbit原创 2016-06-01 11:37:26 · 382 阅读 · 0 评论 -
Hdu 5325 Crazy Bobo (拓扑排序)
解析:对于原树一条边(a,b),令w[a] [code]:#include#include#include#include#includeusing namespace std;const int maxn = 5e5+5;struct Nod{ int b,next; void init(int b,int next){ this->原创 2016-07-10 20:36:33 · 324 阅读 · 0 评论 -
Hdu 5348 MZL's endless loop (构造)
解析:每找到一个单个的环,将其指定顺序后从图中出,最后会得到一个森林,对于每一棵树,从根节点开始根据出入大小指定方向即可。注意实现细节![code]:#include#include#include#include#includeusing namespace std;typedef pair P;const int maxn = 1e5+5;const int ma原创 2016-07-13 21:02:32 · 297 阅读 · 0 评论 -
Hdu 5352 MZL's City (最小费用最大流)
解析:源点S与所有的1查询连边,容量为K,所有的查询与相关的节点连边,容量为1,图中节点1~n与T连边,容量为1,解即是最大流量。通过控制费用,越早的查询费用越大,从而获得最小字典序。[code]:#include#include#include#include//#pragma comment(linker, "/STACK:102400000,102400000")#d原创 2016-07-13 21:13:31 · 448 阅读 · 0 评论 -
HDU 4179 二维的Dijkstra
水题。。可是做的人很少。。。思路: 把每个点i拆成两个点i和i+n,所有与i相关的出边与i相连,与i相关的入边与i+n相连,在求s到t的最短路时就是求s到t+n的最短路,这样就能解决环的问题了。然后看一个二维的dis[i][j],代表从s到i困难度最高为j的最短路,最后上Dijkstra,1A~#include#include#include#include#include#incl原创 2015-06-08 23:21:25 · 319 阅读 · 0 评论 -
HDU 4408 最小生成树的个数
题意很明确,就是求最小生成树的个数……专攻图论也有段时间了,求个最小生成树和判唯一,以及其他的一些应用都还算比较熟练了,但今天这道题,,,真给跪了,,,觉得自己需要补充大量的图论的定理啊什么的。废话少说,,做出来这题参考了这篇题解【矩阵树定理 + kruskal】http://blog.youkuaiyun.com/jarily/article/details/8902402当时做的时候都打算用费原创 2015-06-08 00:08:04 · 631 阅读 · 0 评论 -
HDU 1811 并查集
思路:rateing高的点有指向rating低的点的有向边,用并查集将相同rating 的点放在同一集合内,以此建图。CONFLICT的情况:同一集合内的点有边;有强连通。UNCERTAIN的情况:在拓扑排序的过程中,每次操作入度为0的点的个数大于1 。#include#include#include#include#include#include#include#inc原创 2015-06-04 16:15:54 · 273 阅读 · 0 评论 -
HDU 3938 离线并查集+二分
思路:对于一个能量L ,如果边权设ai为第i个集合的顶点个数,则结果为sigma(ai*(ai-1)/2);但是直接这样做会超时。所以采用二分的做法。对边按权值从小到大排序,在加边的过程中不断更新边的最大值,并记录结果。每次加边,检查边的两个顶点是否在同一集合内,如果不在同一集合内,设两个集合的顶点数为A1和A2,结果+=A1×A2。 #include#inclu原创 2015-06-04 16:36:53 · 414 阅读 · 0 评论 -
HDU 3047 带权并查集
冲突的条件是:用一个dist数组来保存节点到根的距离,这个距离在路径压缩的时候更新一下,dist[x]+=dist[parent[x]],然后 在合并时,令r1=Find(u),r2=Find(v),于是合并时就有parent[r2]=r1,dist[r2]=dist[u]+w-dist[v]。#include#include#include#include#include#incl原创 2015-06-04 16:26:00 · 232 阅读 · 0 评论 -
HDU 3367 最大生成树
【copy的讨论版】这题题意理解了好一阵子才明白, 给出一个图,要求出最大的pseudoforest, 所谓pseudoforest就是指这个图的一个子图,这个子图的每个连通分量中最多只能有一个环, 而且这个子图的所有权值之和最大。这个就是所谓的伪森林。过程类似与kruskal求最小生成树,千万不要直接求最大生成树,一开始时我想到的方法是用kruskal算法求出这个图的最大生成树,原创 2015-06-04 16:33:39 · 2026 阅读 · 0 评论 -
HDU 4081 最小生成树+dfs
参考了这篇题解http://www.cnblogs.com/wally/archive/2013/02/04/2892194.html#include#include#include#include#include#include#include#include#define CLR(a,b) memset(a,b,sizeof(a))using namespace std原创 2015-06-04 16:43:38 · 528 阅读 · 0 评论 -
POJ 3723 最小生成树
构图思路:建立一个节点 ,该节点与其他每一个节点(男孩女孩)相连,权重为10000。 然后女孩xi和男孩yi有关系di,对应边权重设为10000-di。求最小生成树就结束啦~~~#include#include#include#include#include#include#include#include#includeusing namespace std;c原创 2015-06-04 17:00:41 · 254 阅读 · 0 评论 -
HDU1598 并查集 或 二分+DFS
题意:求从s到t的所有路线中最大边权与最小边权差值的最小值。方法一:并查集+贪心将边按照边权从小到大排序,然后依次选取边作为从s到t路线的最小边,然后再按照边权从小到大不断加边,直到s、t联通,则最后加的边的边权与最小边权的差是答案的一个可能解。对最小边依次枚举,答案为所有可能解的最小值。#include#include#include#include#原创 2015-06-04 16:05:36 · 420 阅读 · 0 评论 -
HDU 3629 图的同构
思路:每个顶点不可孤立 ,每个顶点的度不可超过2,则相应的图必定是由若干个链或环组成。如果为链,则必有两顶点度为1 ;如果为环,则每个顶点度均为2 。那么比较两个图的链和环是否完全按相同即可。对每个分支记录分支内的顶点个数 和 是否为环,然后对每个分支进行排序,按照顶点个数从小到大,相同顶点个数的,环在前,链在后。最后依次比较即可。#include#include#原创 2015-06-04 16:52:33 · 401 阅读 · 0 评论 -
HDU 1317 Bellman-Ford
题意:玩家从起点房间带有100能量,到达一个房间后能量为到达前和房间能量的和,每个房间可以重复进入,并且注意图为有向图。整个过程持续到玩家到达最后一个房间,或是能量值耗尽。思路:Bellman-Ford求一遍“最长路”(这里不建议用SPFA,因为对环不好处理)。如果路径中有正环,则检查该环能否到达终点,能则winnable;如果没有环,就判断能否直接到达终点。#include#i原创 2015-06-06 00:18:28 · 323 阅读 · 0 评论 -
hdu3339 dijkstra + dp
先用dijkstra求出各点的最短路,然后就是一个很裸的背包了。#include#include#include#include#includeusing namespace std;const int maxn = 105;const int inf = 0x3f3f3f3f;int n,m,total;int dp[10500];int wgh[maxn];原创 2015-06-07 09:19:48 · 313 阅读 · 0 评论 -
HDU 5296 Annoying problem (树状数组+dfs序+倍增)
题意:一颗n节点的带权无向树,一个初始为空的集合S,有两种操作:1 x 如果S中没有x,加入x ;2 x 如果S中存在x,删除x。每次操作完后求出使S集合连通的最小边权和。解析:设root为S集合的LCA。点i的左右时间戳为L[i],R[i],ans为当前的权重和。当前集合S中添加节点x,如果x不在root的子树中,那么ans += dis[x]+dis[root]-2*dis[lca(x原创 2016-07-06 10:15:30 · 381 阅读 · 0 评论