图论
图论
cutlery1137
这个作者很懒,什么都没留下…
展开
-
洛谷P1194 买礼物【最小生成树】
题目链接:P1194 买礼物程序说明:优惠大于0时建边,跑一边kruskal求最小生成树即可。需要注意的地方是,有可能优惠后的价格比原价还高。。因此需要加一个判断条件。代码如下:#include <iostream>#include <algorithm>using namespace std;const int M = 510;struct Edge { int a, b, w; bool operator < (const Edge &a)原创 2020-11-05 13:12:27 · 287 阅读 · 0 评论 -
洛谷P2071 座位安排【二分图最大匹配】
题目链接:P2071 座位安排程序说明:可以把右边的一列座位放在左边一列的后面,第 i 排左边的编号为 i ,右边的编号为 i + n。二分图的最大匹配可以用匈牙利算法求解。注意每个点连四条边,数组要开四倍大小。代码如下:#include <iostream>#include <cstring>using namespace std;const int N = 10100, M = 2 * N;int h[N], e[M], ne[M], idx, res;in原创 2020-11-04 15:30:51 · 249 阅读 · 0 评论 -
洛谷P1525 关押罪犯【并查集】【二分图】
题目链接:P1525 关押罪犯程序说明:贪心思想,想要将怨气值最小化,就要优先处理怨气值大的两个顶点,将他们分别放在不同的集合。enemy数组记录敌人,每次把与自己敌对的人放进一个集合。代码如下:#include <iostream>#include <cstdio>#include <algorithm>using namespace std;const int N = 20010, M = 100010;//enemy[i]表示i的敌人 int原创 2020-11-01 15:35:40 · 236 阅读 · 0 评论 -
洛谷P1330 封锁阳光大学【二分图】
题目链接:P1330 封锁阳光大学程序说明:题意为判断无向图是否为二分图,可以用dfs染色。-1表示没访问过,0和1表示将顶点染成两种不同的颜色,如果一条边相邻的两个顶点被染成了相同的颜色,则可以判断出不是二分图。如果是二分图,需要记录1和0的个数,较小者即为答案。代码如下:#include <iostream>#include <cstring>using namespace std;const int N = 10010, M = 100010;int h[N原创 2020-11-03 21:59:17 · 172 阅读 · 0 评论 -
洛谷P1195 口袋的天空【最小生成树】
题目链接:P1195 口袋的天空程序说明:最小生成树的裸题,代码如下:#include <iostream>#include <algorithm>using namespace std;const int N = 1010, M = 10010;int n, m, k, p[N];struct Edge { int a, b, w; bool operator < (const Edge &W) const { return w <原创 2020-11-03 16:36:12 · 215 阅读 · 0 评论 -
洛谷P1144 最短路计数【最短路】
题目链接:P1144 最短路计数程序说明:如果搜索到的点到起点的距离等于当前点到起点的距离加上这两点间的那条边的距离,那么我们就将搜索到的点的路径数加上当前点的路径数。如果我们更新了搜索到的点到起点的最短距离,那么我们将到达改点的路径数改为当前点的路径数。(参考P1608 路径统计 题解)因此将spfa的松弛操作修改为://cnt[]记录路径数if(dist[j] > dist[t] + 1) { dist[j] = dist[t] + 1; cnt[j] = cnt[t]; }原创 2020-11-03 11:30:48 · 216 阅读 · 0 评论 -
洛谷P1396 营救【最小生成树】【最短路】
题目链接:P1396 营救程序说明:法一:kruskal求最小生成树,当s和t连通时,此时边的权值w就是题中要求的最小的最大值(因为边是从小到大排序的)。法二:spfa求最短路。分析可知要让每段路的权值都尽可能小,所得到的路径不一定是从s到t的最短路,但是可以利用最短路的模板来解决:取两条边权值的较大者,如果比第三条边小,则更新。只需将spfa中的松弛操作:if(dist[j] > dist[t] + w[i]) dist[j] = dist[t] + w[i];改为:int t原创 2020-11-02 16:40:49 · 517 阅读 · 0 评论 -
洛谷P1629 邮递员送信【最短路】
题目链接:P1629 邮递员送信程序说明:注意每次只能拿一件物品,送到目的地后必须返回起点才能送下一件。因此可以将题目转化为:从1号点到其余各点的最短路,再加上其余各点到1号点的最短路即为正确答案。求多个点到1号点的最短路,可以将邻接矩阵坐标互换(即将有向图反转)。代码如下:#include <iostream>#include <cstring>using namespace std;const int N = 1010, M = 100010;int g[N原创 2020-11-01 21:54:30 · 476 阅读 · 0 评论 -
洛谷P1346 电车【最短路】
题目链接:P1346 电车程序说明难点是建图,把每个路口看成一个顶点,每个顶点的第一条边权值设为0,其余边权值设为1,然后求出最短路就行了。由于顶点数n的范围小,可以用Floyd算法来做。代码如下:#include <iostream>#include <cstring>using namespace std; const int N = 1100;i...原创 2020-02-14 21:06:14 · 169 阅读 · 0 评论 -
洛谷P1265 公路修建【最小生成树】
题目链接:P1265 公路修建程序说明:根据题意可知是最小生成树问题。输入的是顶点的坐标,需要计算出所有的点之间的距离。kruskal算法需要对所有的边按照权值排序,空间代价会很大,因此用prim算法来做。用邻接矩阵存图会MLE,而prim算法在更新点到集合的距离时才会用到边长,因此不需要开二维数组,用一个结构体数组保存坐标就可以了。更新距离的时候可以直接由点坐标计算出距离。还有一点要注...原创 2020-02-14 11:29:53 · 219 阅读 · 0 评论 -
洛谷P2330 [SCOI2005]繁忙的都市【最小生成树】
题目链接:P2330 [SCOI2005]繁忙的都市程序说明:题目中的条件明显能看出来是最小生成树吧(太明显了),最后要求的是最小生成树里权值最大的边。prim和kruskal都能做,kruskal做这道题简直不要太简单。代码如下:#include <iostream>#include <algorithm>using namespace std;cons...原创 2020-02-14 07:26:50 · 228 阅读 · 0 评论