最短路
图论---最短路
(xsj)
模拟只会猜题意
贪心只能过样例
DP一般看规律
数论只会gcd
计算几何瞎暴力
图论只会匈牙利
数据结构没学过
字符串只能干输入
展开
-
acwing 903 昂贵的聘礼 (最短路模型)
题面题解(最短路模型)建立一个超级源点0,从0建立一条边到每个物品,权值为物品的价值。代表花费多少钱就可以购买这个物品。若某个物品拥有替代品,代表从替代品建立一条边到这个物品,价值为替代的价值。 代表我有了这个替代品,那么还需要花费多少就能买这个物品。最后我们枚举等级区间,每次求最短路只能更新区间中的点,然后求一个最小值即可,注意这个等级区间一定要包含终点1,所有区间的左端点就是[ level[1]-m,level[1] ]代码#include<bits/stdc++.h&原创 2021-05-11 15:05:51 · 295 阅读 · 0 评论 -
acwing 920 最优乘车(最短路模型)
题面题解问题转化 :换乘多少次 可以转换为 乘坐过多少次车减1建图:在同一条路线中,任意一个在此路线上的车站均能沿着该路线的方向到达 后面的车站,权值都是1,表示只乘坐一次车 ;通过建图,由于权值均是1,使用bfs求出1号点到n号点最少乘过多少次车代码#include<bits/stdc++.h>using namespace std;const int N=510;int n,m;bool g[N][N];int dist[N];int stop[N];原创 2021-05-10 11:28:12 · 238 阅读 · 0 评论 -
acwing 1126 最小花费(单源最短路模型)
题面题解(最短路模型)代码#include<bits/stdc++.h>using namespace std;const int N=2100;int n,m,A,B;double g[N][N];double dist[N];bool st[N];void dijkstra(){ dist[A]=1; for(int i=0;i<n-1;i++){ int t=-1; for(int j=1;j<=n;j++){ if(!st[j]原创 2021-05-10 10:03:50 · 262 阅读 · 0 评论 -
acwing 1127 香甜的黄油(单源最短路)
题面题解代码#include<bits/stdc++.h>using namespace std;const int N=810,M=3000,INF=0x3f3f3f3f;int n,p,m;int h[N],e[M],ne[M],w[M],idx;int id[N];int dist[N];bool st[N];void add(int a,int b,int c){ e[idx]=b; w[idx]=c; ne[idx]=h[a]; h[a]=id原创 2021-05-09 21:27:50 · 191 阅读 · 0 评论 -
acwing 1128 信使(单源最短路)
题面题解(单源最短路)问题的转化:对于每个点,它接收到信的时间,等于它到指挥部的最短距离,因此只需要求 1号点到所有点的最短距离的最大值代码#include<bits/stdc++.h>using namespace std;const int N = 110, INF = 0x3f3f3f3f;int n, m;int dist[N][N];void floy() { for (int k = 1; k <= n; k++) { f原创 2021-05-09 17:28:08 · 214 阅读 · 0 评论 -
acwing 1129 热浪 (单源最短路)
题面题解(单源最短路)代码(spfa)#include<bits/stdc++.h>using namespace std;const int N = 2510, M = 6200 * 2 + 10;int n, m, S, T;int h[N], e[M], ne[M], w[M], idx;int dist[N];bool st[N];void add(int a, int b, int c) { e[idx] = b; w[idx] = c;原创 2021-05-09 16:09:12 · 152 阅读 · 0 评论 -
acwing 854 Floyd求最短路
题面题解求多源最短路问题用floyd算法,O(n3), 基于动态规划,用k表示状态,每次循环都是讲上一次的状态更新代码#include<bits/stdc++.h>using namespace std;const int INF = 0x3f3f3f3f;const int N = 210;int n, m, k;int d[N][N];void init() { for (int i = 1; i <= n; i++) { for原创 2021-03-06 17:17:30 · 264 阅读 · 1 评论 -
acwing 849 Dijkstra求最短路 I
题面题解求单源最短路(所有边权都是正) O( n 2 ) 基于贪心 适用于稠密图(边-顶点:m-n 2) 邻接矩阵2.概括:先初始化1号点到1号点的距离为0,其他点的距离设为正无穷,然后每次找到一个1号点到其他点距离最小的点t,用t来更新其他点的距离,min(dist[j] ,dist[t]+g[t][j]),循环n-1次dist[n]就是更新好的距离代码#include<iostream>#include<cstdio>#inclu原创 2021-03-05 21:34:57 · 136 阅读 · 0 评论 -
acwing 850 Dijkstra求最短路 II
题面题解当n和m都是1e5的话,代码原创 2021-03-06 08:14:02 · 147 阅读 · 0 评论 -
acwing 853 有边数限制的最短路 (Bellman-Ford算法)
题面题解如果图中存在负权回路,则不一定有最短路(我们更新距离,每次经过回路值就会减少,无限循环就会变为负无穷)备份数组:每次迭代前,都要将原来的dist数组备份,防止发生串联,比如图中,我们第一次迭代,用1的距离将2号点更新成了1,dist[2]=1,那么拿1号点更新3的时候,如果还是拿dist[2]+w[3]来更新dist[3]的话,就会出错,应该用dist[3]=dist[1]+w[3]=3 来更新才是正确的k的意义:有边数k的限制,我们就应该迭代k次,就表示从1号点到n号点最原创 2021-03-06 14:19:56 · 196 阅读 · 0 评论 -
acwing 851 spfa求最短路(spfa算法)
题面题解spfa算法用于求单源最短路,适用于图中存在负权边,但是不能有负环,O(m),最坏的情况下是O(nm) ,也可以求解dijkstraspfa其实就是队列优化的bellman-ford算法,bellman-ford算法每次迭代都要更新dist[b]=dist[a]+w , 但是这样有很多操作都是浪费的,因为只有dist[a]变小了,才能有效的更新dist[b],否则是不会更新的那么我们可以用队列每次将变小的点加入,然后用这个点去更新与他相连的点,如果能更新成功,就将更新的原创 2021-03-06 15:24:56 · 235 阅读 · 0 评论 -
acwing 852 spfa判断负环
题面题解原理:我们可以用一个cnt[t] 来记录点1 - t 经过的点数,那么每次拿t来更新其他点 j 的最小距离时,cnt[j] =cnt[t]+1 (1—>t—>j) ,那么当cnt[j]>=n,表示1-j之间(包括自己)最少有n+1个点,肯定是不合法的为什么会出现cnt[j]>=n这种情况呢,就是因为图中存在负环,每次经过负环dist都会变小,所以会一直更新,那么cnt[j]就是一直变大超出n代码#include<bits/stdc++.h&原创 2021-03-06 16:18:18 · 107 阅读 · 0 评论