图论
无
DJL_DJL_DJL
程序是我的生命,但我相信爱她甚过爱我的生命。
展开
-
Acwing_362区间【差分约束】
题目链接:Acwing_362区间思路分析:本题同样考察差分约束,难点在于想到用前缀和的方法去求解。题目中有两个地方可以想到需要使用前缀和,第一个地方是集合Z中在[ai,bi]中的的x不少于ci个,要求一个集合在若干个区间中数的个数,最快的方法就是使用前缀和。另一个是只要求集合在给定区间中数的个数不小于c,但是这些数的选取并不是唯一的,所以Z中具体数的值并不重要,只需要知道在每个区间内Z中元素的个数是多少,这里也暗示了使用前缀和。设s[i]表示集合Z中有s[i]个元素是在1到i之间的,则在区间原创 2021-08-29 16:45:48 · 89 阅读 · 0 评论 -
Acwing_1169糖果【差分约束】
题目描述:幼儿园里有 N 个小朋友,老师现在想要给这些小朋友们分配糖果,要求每个小朋友都要分到糖果。但是小朋友们也有嫉妒心,总是会提出一些要求,比如小明不希望小红分到的糖果比他的多,于是在分配糖果的时候, 老师需要满足小朋友们的 K 个要求。幼儿园的糖果总是有限的,老师想知道他至少需要准备多少个糖果,才能使得每个小朋友都能够分到糖果,并且满足小朋友们所有的要求。输入格式:输入的第一行是两个整数 N,K。接下来 K 行,表示分配糖果时需要满足的关系,每行 3 个数字 X,A,B。如果 X=1.原创 2021-08-29 11:43:02 · 121 阅读 · 0 评论 -
Acwing_344观光之旅【Floyd应用: 最小环】
题目链接:Acwing_344观光之旅思路分析:1.本题的思路就是考虑最小环里面节点编号最大的节点为k,且环里面与k相连的两个点为i,j,环的长度为g[i][k]+g[k][j]+d[j][i];2.则d[j][i]则表示j到i且经过的节点编号小于k,因为在环中k就是最大的,只能经过小于k的节点了;3.则这与floyd中k次循环开始前的d[i][j]意义相同;4.那就不妨在floyd的第一重循环就求一下以k为最大节点编号的环的长度,注意这里的k必须与节点的意义一样:0-n-1或1-n;AC代码:原创 2021-08-29 09:41:22 · 597 阅读 · 1 评论 -
Acwing_1148秘密的牛奶运输【最小生成树应用: 次小生成树】
题目描述:农夫约翰要把他的牛奶运输到各个销售点。运输过程中,可以先把牛奶运输到一些销售点,再由这些销售点分别运输到其他销售点。运输的总距离越小,运输的成本也就越低。低成本的运输是农夫约翰所希望的。不过,他并不想让他的竞争对手知道他具体的运输方案,所以他希望采用费用第二小的运输方案而不是最小的。现在请你帮忙找到该运输方案。注意:如果两个方案至少有一条边不同,则我们认为是不同方案;费用第二小的方案在数值上一定要严格小于费用最小的方案;答案保证一定有解;输入格式:第一行是两个整数 N,原创 2021-08-28 23:10:36 · 116 阅读 · 0 评论 -
Acwing_346走廊泼水节【最小生成树应用: 最小完全图】
题目描述:给定一棵N个节点的树,要求增加若干条边,把这棵树扩充为完全图,并满足图的唯一最小生成树仍然是这棵树。求增加的边的权值总和最小是多少。注意: 树中的所有边权均为整数,且新加的所有边权也必须为整数。输入格式:第一行包含整数t,表示共有t组测试数据。对于每组测试数据,第一行包含整数N。接下来N-1行,每行三个整数X,Y,Z,表示X节点与Y节点之间存在一条边,长度为Z。输出格式:每组数据输出一个整数,表示权值总和最小值。每个结果占一行。数据范围:1≤N≤60001≤Z≤100输原创 2021-08-28 23:03:51 · 118 阅读 · 0 评论 -
Acwing_1145北极通讯网络【最小生成树扩展应用】
思路分析:题目要求的其实就是最小生成树后,取第K大的边,因为要求所有的点连通,并且可以选择其中k个点的权值变为0,求其中最小生成树的最大边最小。AC代码://找一个最小d值,使得将所有权值大于d的边删除之后,整个图形的连通块的个数不超过k#include <cstring>#include <iostream>#include <algorithm>#include <cmath>#define x first#define y seco原创 2021-08-28 22:57:59 · 83 阅读 · 0 评论 -
Acwing_1146新的开始【最小生成树应用:建立虚拟源点】
题目描述:发展采矿业当然首先得有矿井,小 FF 花了上次探险获得的千分之一的财富请人在岛上挖了 n 口矿井,但他似乎忘记了考虑矿井供电问题。为了保证电力的供应,小 FF 想到了两种办法:在矿井 i 上建立一个发电站,费用为 vi(发电站的输出功率可以供给任意多个矿井)。将这口矿井 i 与另外的已经有电力供应的矿井 j 之间建立电网,费用为 pi,j。小 FF 希望你帮他想出一个保证所有矿井电力供应的最小花费方案。输入格式:第一行包含一个整数 n,表示矿井总数。接下来 n 行,每行一个整数,第原创 2021-08-28 22:55:15 · 94 阅读 · 0 评论 -
Acwing_1141局域网【kruskal简单应用】
题目描述:某个局域网内有 n 台计算机和 k 条 双向 网线,计算机的编号是 1∼n。由于搭建局域网时工作人员的疏忽,现在局域网内的连接形成了回路,我们知道如果局域网形成回路那么数据将不停的在回路内传输,造成网络卡的现象。注意:对于某一个连接,虽然它是双向的,但我们不将其当做回路。本题中所描述的回路至少要包含两条不同的连接。两台计算机之间最多只会存在一条连接。不存在一条连接,它所连接的两端是同一台计算机。因为连接计算机的网线本身不同,所以有一些连线不是很畅通,我们用 f(i,j) 表示 i,原创 2021-08-28 16:44:40 · 72 阅读 · 0 评论 -
Acwing_1140最短网络【prim简单应用】
题目链接:Acwing_1140最短网络模板题目,套模板即可AC代码:#include<iostream>#include<algorithm>#include<cstring>using namespace std;const int N = 105;int n;int g[N][N];int dist[N];bool st[N];int prim() { int res = 0; memset(dist, 0x3f, sizeof d原创 2021-08-28 16:41:00 · 59 阅读 · 0 评论 -
Acwing_344观光之旅【Floyd求解最小环问题】
题目链接:Acwing_344观光之旅AC代码:#include<iostream>#include<cstdio>#include<cstring>#include<algorithm>using namespace std;const int N = 110, INF = 0x3f3f3f3f;int n, m;int d[N][N], g[N][N];int pos[N][N];int path[N], cnt;void ge原创 2021-08-28 15:46:52 · 53 阅读 · 0 评论 -
Acwing_343排序【Floyd求解传递闭包】
题目链接:Acwing_343排序思路分析:本题考察Floyd算法在传递闭包问题上的应用。给定若干对元素和若干对二元关系,并且关系具有传递性,通过传递性推导出尽量多的元素之间的关系的问题被称为传递闭包。比如a < b,b < c,就可以推导出a < c,如果用图形表示出这种大小关系,就是a到b有一条有向边,b到c有一条有向边,可以推出a可以到达c,找出图中各点能够到达点的集合,就类似于Floyd算法求图中任意两点间的最短距离。Floyd求解传递闭包问题的代码如下:只是对原来算原创 2021-08-28 15:44:58 · 87 阅读 · 0 评论 -
Acwing_1125牛的旅行【Floyd应用】
题目链接:Acwing_1125牛的旅行AC代码:#include <iostream>#include <algorithm>#include <cmath>using namespace std;const int N = 152;const double INF = 1e20;typedef pair<int, int> PII;PII q[N];char g[N][N];double d[N][N], maxd[N];doubl原创 2021-08-28 15:41:10 · 74 阅读 · 0 评论 -
Acwing_340通信线路【最短路+二分】
题目链接:Acwing_340通信线路思路分析:题意是叫我们可以把k个边权值变为0,之后选取一条路径,该路径的总权值和是该路径上的最大权值,求最短路径,这题先要处理一下把那些边变为0,最后再求最短路即可做法:我们二分一个X,X为满足从1点到N点至少有一条路径上权值大于X的边小于等于K,这样如果我们求这个X的最小值,就是答案了,那么对于每一次X都要求一次最短路,我们把大于X的权值的边权值置为1,小于等于的置为0,然后求一边最短路,即可求出最少要经过几条大于X的路径,判断是否小于等于k即可对于边权只有原创 2021-08-27 16:31:32 · 93 阅读 · 0 评论 -
Acwing_1134最短路计数
题目描述:给出一个 N 个顶点 M 条边的无向无权图,顶点编号为 1 到 N。问从顶点 1 开始,到其他每个点的最短路有几条。输入格式:第一行包含 2 个正整数 N,M,为图的顶点数与边数。接下来 M 行,每行两个正整数 x,y,表示有一条顶点 x 连向顶点 y 的边,请注意可能有自环与重边。输出格式:输出 N 行,每行一个非负整数,第 i 行输出从顶点 1 到顶点 i 有多少条不同的最短路,由于答案有可能会很大,你只需要输出对 100003 取模后的结果即可。如果无法到达顶点 i 则输出原创 2021-08-27 15:32:09 · 72 阅读 · 0 评论 -
Acwing_383观光【次短路】
题目链接:Acwing_383观光AC代码:/*d[i,0];//表示从1到i的最短路径d[i,1];//表示从1到i的次短路径*/#include <cstdio>#include <cstring>#include <iostream>#include <algorithm>#include <queue>using namespace std;const int N = 1010, M = 20010;str原创 2021-08-27 15:27:39 · 92 阅读 · 0 评论 -
Acwing_1137最佳线路【多起点最短路问题】
题目描述:有一天,琪琪想乘坐公交车去拜访她的一位朋友。由于琪琪非常容易晕车,所以她想尽快到达朋友家。现在给定你一张城市交通路线图,上面包含城市的公交站台以及公交线路的具体分布。已知城市中共包含 n 个车站(编号1~n)以及 m 条公交线路。每条公交线路都是 单向的,从一个车站出发直接到达另一个车站,两个车站之间可能存在多条公交线路。琪琪的朋友住在 s 号车站附近。琪琪可以在任何车站选择换乘其它公共汽车。请找出琪琪到达她的朋友家(附近的公交车站)需要花费的最少时间。输入格式:输入包含多组测原创 2021-08-27 10:39:45 · 207 阅读 · 0 评论 -
Acwing_1131拯救大兵瑞恩【最短路上的DP问题】
思路分析:题目很好,明确的体会到了dp和最短路之间的关系,一般先给出dp的状态和转移,之后建图,在最短路算法中去跟新时候再用到了dp的转移方程,这题也是一样,不过最短路由于这里dp的点之间权值只有0/1,所以可以用双端队列的方式处理,复杂度为O(n),总结:一般dp就是特殊的最短路,只不过是在拓扑图上进行的最短路,算多种条件的最短路的时候先采用dp的思想,求出状态表示和转移方程,之后建图,把每一个dp的状态作为一个点进行建图,但不必所有点之间都要有实际的边,只要能判断是否能由一个状态转移到另一个状态即原创 2021-08-27 10:26:51 · 82 阅读 · 0 评论 -
Acwing_1135新年好【spfa+dfs】
题目描述:重庆城里有 n 个车站,m 条 双向 公路连接其中的某些车站。每两个车站最多用一条公路连接,从任何一个车站出发都可以经过一条或者多条公路到达其他车站,但不同的路径需要花费的时间可能不同。在一条路径上花费的时间等于路径上所有公路需要的时间之和。佳佳的家在车站 1,他有五个亲戚,分别住在车站 a,b,c,d,e。过年了,他需要从自己的家出发,拜访每个亲戚(顺序任意),给他们送去节日的祝福。怎样走,才需要最少的时间?输入格式第一行:包含两个整数 n,m,分别表示车站数目和公路数目。第二原创 2021-08-26 22:40:35 · 79 阅读 · 0 评论 -
Acwing_920最优乘车【NOI 1997-考察单端最短路的建图方式】
题目链接:Acwing_920最优乘车这道题具体的思路还是挺简单的,只是考虑如何把具体问题建成图的模型AC代码:#include<iostream>#include<cstdio>#include<algorithm>#include<sstream>#include<cstring>using namespace std;const int N = 510;int m, n;bool g[N][N];int dist[原创 2021-08-26 17:34:47 · 80 阅读 · 0 评论 -
Acwing_852spfa判断负环【SPFA算法】
输入样例:3 31 2 -12 3 43 1 -4输出样例:YesAC代码:#include<iostream>#include<cstring>#include<algorithm>#include<queue>using namespace std;const int N = 1e5 + 10;int h[N], e[N], w[N], ne[N], idx;int n, m;queue<int> q.原创 2021-08-26 15:15:11 · 67 阅读 · 0 评论 -
Acwing_851spfa求最短路【SPFA算法】
题目链接:Acwing_851spfaAC代码:#include<iostream>#include<cstring>#include<algorithm>#include<queue>using namespace std;const int N = 1e5 + 10;int h[N], e[N], w[N], ne[N], idx;int n, m;queue<int> q;int st[N], dist[N];vo原创 2021-08-26 15:02:12 · 61 阅读 · 0 评论 -
Acwing_853有边数限制的最短路【Bellman-Ford】
题目链接:Acwing_853有边数限制的最短路思路分析:1.为什么需要back[a]数组?为了避免如下的串联情况, 在边数限制为一条的情况下,节点3的距离应该是3,但是由于串联情况,利用本轮更新的节点2更新了节点3的距离,所以现在节点3的距离是2。正确做法是用上轮节点2更新的距离--无穷大,来更新节点3, 再取最小值,所以节点3离起点的距离是32.为什么是dist[n]>0x3f3f3f3f/2, 而不是dist[n]>0x3f3f3f3f ?5号节点距离起点的距离是无穷大,利用原创 2021-08-26 14:48:34 · 69 阅读 · 0 评论 -
Acwing_1174受欢迎的牛【有向图的强连通分量】
输入样例:3 31 22 12 3输出样例:1思路分析:如果对于一个有向无环图判断一个点是否可以被全部点走到,只要判断一下是否只有一个出度为0的点即可,那么这题只要把这个图转化为有向无环图即可,这一步可以用tarjan,把所有的强连通分量找出来,那么把一个强连通分量当作一个点,这样必然就是一个有向无环图,接下来判断一下是否只有一个出度为0的点,那么答案就是这个点代表的强连通分量内点的个数。AC代码:#include<iostream>#include<cst.原创 2021-08-26 09:31:15 · 91 阅读 · 0 评论 -
Acwing_378骑士放置【二分图的最大独立集】
题目链接:Acwing_378骑士放置知识点:最大独立集=总点数-最大匹配数AC代码:#include<iostream>#include<algorithm>#include<cstdio>#include<cstring>using namespace std;typedef long long ll;typedef pair<int, int> pii;typedef unsigned long long ull;#d原创 2021-08-25 20:32:16 · 61 阅读 · 0 评论 -
Acwing_376机器任务【二分图的最小点覆盖】
题目链接:Acwing_376机器任务知识点:二分图的最小点覆盖等于最大匹配数,此题用匈牙利算法#include<iostream>#include<cstdio>#include<cstring>using namespace std;typedef long long ll;typedef pair<int, int> pii;typedef unsigned long long ull;const int N = 110;int原创 2021-08-25 17:25:44 · 59 阅读 · 0 评论 -
Acwing_372棋盘覆盖【二分图实际应用】
题目链接:Acwing_372棋盘覆盖AC代码:#include<cstring>#include<iostream>#include<algorithm>using namespace std;#define x first#define y secondtypedef pair<int, int> PII;const int N = 110;int n, m;PII match[N][N];bool g[N][N], st[N原创 2021-08-25 16:45:34 · 68 阅读 · 0 评论 -
Acwing_352闇の連鎖【树上差分+最近公共祖先】
题目链接:Acwing_352闇の連鎖AC代码:#include<iostream>#include<cstdio>#include<algorithm>using namespace std;typedef long long ll;typedef pair<int, int> pii;typedef unsigned long long ull;const int N = 100010, M = N * 2;int n, m;int原创 2021-08-25 14:42:26 · 63 阅读 · 0 评论 -
Acwing_1171距离【最近公共祖先(tarjan算法)】
题目描述:给出 n 个点的一棵树,多次询问两点之间的最短距离。注意:边是无向的。所有节点的编号是 1,2,…,n。输入格式:第一行为两个整数 n 和 m。n 表示点数,m 表示询问次数;下来 n−1 行,每行三个整数 x,y,k,表示点 x 和点 y 之间存在一条边长度为 k;再接下来 m 行,每行两个整数 x,y,表示询问点 x 到点 y 的最短距离。树中结点编号从 1 到 n。输出格式:共 m 行,对于每次询问,输出一行询问结果。数据范围:2≤n≤10^4,1≤m≤2×10^原创 2021-08-25 11:29:59 · 110 阅读 · 0 评论 -
Acwing_1172祖孙询问【最近公共祖先(倍增法)】
题目描述:输入样例:10234 -112 23413 23414 23415 23416 23417 23418 23419 234233 195234 233233 12233 13233 15233 19输出样例:10002思路分析:求最近公共祖先有两种方法:向上标记法倍增法此题用的是倍增法,具体思路如下:(1)fa[i][j] 表示从i开始,向上走2^j步所能走到的节点 0<=j<=logn(2)depth[i]表原创 2021-08-25 10:15:24 · 89 阅读 · 0 评论 -
2020年蓝桥杯省模拟赛-通电(Java)
感觉这题没啥,主要就是套prim算法模版,然后再根据题目的要求进行计算代码实现:package com.DJL.Test;import java.util.Arrays;import java.util.Scanner;public class test1{ static Scanner in = new Scanner(System.in); static boolean[] vis = new boolean[1005]; static double[] dis =原创 2021-04-15 23:16:59 · 192 阅读 · 0 评论 -
最短工期(Java)
题目描述:一个项目由若干个任务组成,任务之间有先后依赖顺序。项目经理需要设置一系列里程碑,在每个里程碑节点处检查任务的完成情况,并启动后续的任务。现给定一个项目中各个任务之间的关系,请你计算出这个项目的最早完工时间。输入格式:首先第一行给出两个正整数:项目里程碑的数量 N(≤100)和任务总数 M。这里的里程碑从 0 到 N−1 编号。随后 M 行,每行给出一项任务的描述,格式为“任务起始里程碑 任务结束里程碑 工作时长”,三个数字均为非负整数,以空格分隔。输出格式:如果整个项目的安排是合理可行的原创 2021-04-17 09:19:09 · 578 阅读 · 0 评论 -
【欧拉回路和欧拉路径】
定义:通过图中所有边恰好一次且行遍所有顶点的通路称为欧拉通路。通过图中所有边恰好一次且行遍所有顶点的回路称为欧拉回路。这一道题需要用到一个小技巧:偶数异或1等同于加1,奇数异或1等同于减1模板题目描述:#include <iostream>#include <cstring>using namespace std;// 要建反向边,所以边数要开两倍const int N = 100100, M = 400100;int h[N], e[M], ne[M], .原创 2021-08-16 20:08:15 · 119 阅读 · 0 评论 -
Acwing_164可达性统计【拓扑排序应用】
题目链接:Acwing_164可达性统计AC代码:#include<iostream>#include<bitset>#include<algorithm>#include<cstring>#include<cstdio>using namespace std;const int N = 10, M = 10;int n, m;int h[N], e[M], ne[M], idx;int d[N], q[N];bitse原创 2021-08-16 15:19:34 · 87 阅读 · 0 评论 -
【SPFA算法】
SPFA算法是从Bellman-Ford算法使用队列优化而来的,可以用来判断是否存在负环,期望时间复杂度为O(kE),k是一个常数,一般不超过2,算法比较高效#include<iostream>#include<vector>#include<algorithm>#include<queue>using namespace std;const int MAXV = 200;const int INF = 0x3f3f3f3f;struct N原创 2021-08-16 10:33:54 · 66 阅读 · 0 评论 -
【Bellman-Ford算法】
算法模板可以用于判断是否有负环出现#include<iostream>#include<cstdio>#include<algorithm>#include<vector>using namespace std;const int INF = 0x3f3f3f3f;const int MAXV = 200;struct Node { int v, dist;//v为邻接边的目标顶点,dis为邻接边的边权 Node(int _v, in原创 2021-08-15 22:45:43 · 47 阅读 · 0 评论 -
【Floyd算法】
算法模板#include<iostream>#include<cstdio>#include<algorithm>using namespace std;const int INF = 0x3f3f3f3f;const int MAXV = 200;//最大顶点数int n, m;//n为顶点数,m为边数int dis[MAXV][MAXV];//dis[i][j]表示顶点i和顶点j的最短距离void Floyd() { for(int k=0;k原创 2021-08-15 21:59:40 · 43 阅读 · 0 评论 -
【二分图的最大匹配】
模板题: AcWing 861. 二分图的最大匹配输入样例:2 2 41 11 22 12 2输出样例:2AC代码:#include <iostream>#include <vector>#include <memory.h>using namespace std;const int N = 510;const int M = 100010;int n1, n2, m;int match[N];bool st[N];vect原创 2021-08-13 16:34:26 · 39 阅读 · 0 评论 -
【染色法判别二分图】
模板题: AcWing 860. 染色法判定二分图解题思路:(1)判断一个图是否是二分图,判断是否存在奇数环即可,用染色法判断即可。(2)二分图: 是指可以将点集分成两半,每个集合内都没有边,但可以与另一个集合中的点构成边,当且仅当一个图不存在奇数环的时候是二分图,奇数环是指环中的边数为奇数(3)染色法: 将一个图染成只有1和2两种颜色,dfs每一个点,连通的染成不同颜色,如果发现这两个点连通且颜色相同,则说明出现了奇数环,一定不是一个二分图。题目描述:输入样例:4 41 31 42原创 2021-08-13 16:06:47 · 142 阅读 · 0 评论 -
【kruskal算法】
输入样例:4 51 2 11 3 21 4 32 3 23 4 4输出样例:6AC代码:#include<iostream>#include<algorithm>#include<cstdio>using namespace std;const int N = 100010;int n, m;int p[N];struct Edge { int a, b, w; bool operator<(const Edge&原创 2021-08-13 15:27:31 · 61 阅读 · 0 评论 -
【朴素版prim算法】
输入样例:4 51 2 11 3 21 4 32 3 23 4 4输出样例:6针对于稠密图用prim算法,稀疏图用kruskal算法AC代码://对应的图为无向图,针对于稠密图#include<iostream>#include<algorithm>#include<cstdio>#include<cstring>using namespace std;const int N = 510,INF=0x3f3f3f3f.原创 2021-08-13 14:30:44 · 72 阅读 · 0 评论