Acwing
信仰xinyang
这个作者很懒,什么都没留下…
展开
-
acwing860 染色法判断二分图
给定一个n个点m条边的无向图,图中可能存在重边和自环。请你判断这个图是否是二分图。输入格式第一行包含两个整数n和m。接下来m行,每行包含两个整数u和v,表示点u和点v之间存在一条边。输出格式如果给定图是二分图,则输出“Yes”,否则输出“No”。数据范围1≤ n,m≤ 105输入样例:4 41 31 42 32 4输出样例:Yes#define _CRT_SECURE_NO_WARNINGS 1//当无向图图中不含有奇数环时此图一定为二分图//染色法判定二分图://当一原创 2021-05-27 16:54:55 · 110 阅读 · 0 评论 -
acwing859 kruskal求最小生成树
#define _CRT_SECURE_NO_WARNINGS 1//不需要用邻接表或者邻接矩阵来存,用一个结构体存边就可以#include<iostream>#include<algorithm>#include<cstring>using namespace std;const int N = 100010, M = 200010, INF = 0x3f3f3f3f;int n, m;int p[N];//并查集数组struct Edge{ i.原创 2021-05-26 22:48:06 · 84 阅读 · 0 评论 -
acwing858prim求最小生成树
#define _CRT_SECURE_NO_WARNINGS #include<cstring>#include<iostream>#include<algorithm>//prim算法和dijkstra算法类似,只不过prim算法更新的是点到已经生成的最小生成树的距离using namespace std;const int N = 510, INF = 0x3f3f3f3f, M = 100010;int n, m;int g[N][N];//稠密.原创 2021-05-26 17:02:05 · 78 阅读 · 0 评论 -
acwing852.spfa判断负环
给定一个n个点m条边的有向图,图中可能存在重边和自环, 边权可能为负数。请你判断图中是否存在负权回路。输入格式第一行包含整数n和m。接下来m行每行包含三个整数x,y,z,表示存在一条从点x到点y的有向边,边长为z。输出格式如果图中存在负权回路,则输出“Yes”,否则输出“No”。数据范围1≤n≤2000 ,1≤m≤10000 ,图中涉及边长绝对值均不超过10000。输入样例:3 31 2 -12 3 43 1 -4输出样例:Yes#define _CRT_SECURE_NO原创 2021-05-24 20:52:12 · 101 阅读 · 0 评论 -
acwing 851. spfa求最短路
//spfa算法从bellmanford算法用队列优化而来,bellmanford每次遍历所有的边//而spfa使用队列,将一个点的最短路径缩小的点加入队列,来遍历这个点的所有出边,降低了时间复杂度//由于SPFA算法是由Bellman_ford算法优化而来,在最坏的情况下时间复杂度和它一样即时间复杂度为 O(nm) #include<iostream>#include<cstring>#include<queue>#include<algorithm.原创 2021-05-24 18:09:46 · 97 阅读 · 0 评论 -
acwing 853. 有边数限制的最短路(bellman_ford算法)
//有边数限制的题且存在负权边 只能用bellman ford算法//如果路径中存在负环且在必要路径上//边权是负数适用bellmanford和spfa Bellman-Ford算法的优点是可以发现负圈,缺点是时间复杂度比Dijkstra算法高。//如果图里存在负环,则不存在最短路径#include<iostream>#include<cstring>using namespace std;const int N=510,M=10010;struct edge{.原创 2021-05-23 18:45:35 · 198 阅读 · 0 评论 -
acwing 850. Dijkstra求最短路 II
#define _CRT_SECURE_NO_WARNINGS 1//堆优化版的dijkstra算法//稀疏图 用邻接表储存//主要是优化找找出最短一点的路径这一步 用堆来选择//时间复杂度O(mlogn)//建堆两种方式,1.手写堆2.优先队列//在这里用stl优先队列 priority queue#include<iostream>#include<queue>#include<cstring>#include<algorithm>.原创 2021-05-23 15:51:08 · 137 阅读 · 0 评论 -
acwing849 Dijkstra求最短路 I
#include<cstring>#include<iostream>#include<algorithm>using namespace std;const int N=510;int n,m;int g[N][N];//g存储每条边int dist[N];//存储1号点到每个点的最短距离bool st[N];//存储某点的最短路是否已经确定int dijkstra()//时间复杂度为O(n^2){ memset(dist,0x3f,siz.原创 2021-05-22 21:44:49 · 93 阅读 · 0 评论 -
acwing848有向图的拓扑排序
#define _CRT_SECURE_NO_WARNINGS 1#include<algorithm>#include<cstring>#include<iostream>using namespace std;const int N = 100010;int e[N], idx, ne[N], h[N];int q[N], d[N];int n, m;void add(int a, int b){ e[idx] = b, ne[idx] = h.原创 2021-05-21 14:04:41 · 105 阅读 · 0 评论 -
acwing846树的重心
#include<iostream>#include<cstring>#include<algorithm>using namespace std;const int N = 100010, M = 2 * N;//题中要求为无向图,故边的条数是节点数的二倍int n;int e[M], idx, h[N], ne[M];int ans = N;//ans保存最大子树中的最小值bool st[N];//布尔数组表示状态,当防止重复搜索void add(.原创 2021-05-21 12:43:55 · 68 阅读 · 0 评论 -
acwing844走迷宫(BFS)
STL#define _CRT_SECURE_NO_WARNINGS 1#include<iostream>#include<algorithm>#include<queue>#include<cstring>using namespace std;const int N = 110;int d[N][N], g[N][N];//d为数组保存点到起点的距离 g数组为迷宫int n, m;typedef pair<int, int&g.原创 2021-05-20 10:37:59 · 157 阅读 · 0 评论 -
acwing842排列数字(DFS)
#define _CRT_SECURE_NO_WARNINGS 1//整体利用DFS的思想#include<iostream>using namespace std;const int N = 10;int path[N];//path记录当前的排列bool st[N];//bool数组st表示状态,st[i]=true表示未被使用,false表示使用过int n;void DFS(int u){ if (u == n) { for (int i = 0; i <.原创 2021-05-17 19:05:53 · 150 阅读 · 0 评论 -
acwing840散列表
维护一个集合,支持如下几种操作:“I x”,插入一个数x;“Q x”,询问数x是否在集合中出现过;现在要进行N次操作,对于每个询问操作输出对应的结果。输入格式第一行包含整数N,表示操作数量。接下来N行,每行包含一个操作指令,操作指令为”I x”,”Q x”中的一种。输出格式对于每个询问指令“Q x”,输出一个询问结果,如果x在集合中出现过,则输出“Yes”,否则输出“No”。每个结果占一行。数据范围1≤N≤105−109≤x≤109输入样例:5I 1I 2I 3Q 2Q原创 2021-05-09 16:34:09 · 97 阅读 · 0 评论 -
acwing837连通块中点的数量
//本次思路即为合并集合的稍微变形#define _CRT_SECURE_NO_WARNINGS 1#include<iostream>using namespace std;const int N = 100010;int n, m;int p[N];int siz[N];int find(int x)//合并集合并且压缩路径{ if (p[x] != x) p[x] = find(p[x]); return p[x];}int main(){ scanf("%.原创 2021-05-06 17:45:33 · 90 阅读 · 0 评论 -
acwing836合并集
![在这里插入图片描述](https://img-blog.csdnimg.cn/20210506170119981.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L20wXzUyMjc2MTY1,size_16,color_FFFFFF,t_70原创 2021-05-06 17:04:16 · 90 阅读 · 0 评论 -
acwing803区间合并(区间贪心)
1.题目描述2.思路将传入的区间范围排序,不同区间存在三种情况,第一种,维护区间和枚举区间有交集,比如维护区间范围[1,3],枚举区间范围[2,4],此时将两区间合并为[1,4],即将维护区间的ed更新为枚举区间的en。第二种,维护区间[1,3],枚举区间[1,2],此时维护区间不变,继续枚举下一个区间。第三种,维护区间与枚举区间无交集,维护区间[1,3],枚举区间[4,5],此时将维护区间写入保存数据的vector向量中,枚举区间变成新的维护区间,并与下一个枚举区间做操作,如果此时新的维护区间为最后原创 2021-04-25 19:36:01 · 115 阅读 · 0 评论 -
位运算acwing801
题目描述给定一个长度为n的数列,请你求出数列中每个数的二进制表示中1的个数。思路:考察位运算,定义一个数的二进制表示中最低位下标为0,例10101 从左到右下标一次为4 3 2 1 0右移k位&1即可得到k位数字lowbit操作:取出数字的二进制行驶中最后一个1所在位置及以后位置的数字x&-x=x(~x+1)例如:x=10000101010000~x=01111010101111~x+1=011110110000x(~x+1)=10000#define _CRT_SEC原创 2021-04-24 20:34:56 · 134 阅读 · 0 评论 -
acwing798.二维数组差分
题目求x1y1x2y2此矩阵c的矩阵和,x1y1处元素加c,则x1y1右下角所有元素的前缀和都+c,经历后两步-c之后,该区域正右侧和下侧多加的C被减去,而右下角被减去两次因此[x2+1][y2+1]+c#include<iostream>using namespace std;const int N=1010;int a[N][N],b[N][N];int n,m,q;int main(){ scanf("%d%d%d",&n,&m,&q);原创 2021-04-19 22:59:08 · 116 阅读 · 0 评论 -
acwing797.一维差分
题目输入一个长度为 n的整数序列。接下来输入 m个操作,每个操作包含三个整数 l,r,c,表示将序列中 [l,r] 之间的每个数加上 c。请你输出进行完所有操作后的序列。输入格式第一行包含两个整数 n和 m。第二行包含 n个整数,表示整数序列。接下来 m行,每行包含三个整数 l r,c,表示一个操作。输出格式共一行,包含 n个整数,表示最终序列。数据范围1≤n,m≤100000,1≤l≤r≤n,−1000≤c≤1000,−1000≤整数序列中元素的值≤1000输入样例:6 31原创 2021-04-19 22:02:34 · 140 阅读 · 0 评论 -
796.子矩阵的和
输入一个n行m列的整数矩阵,再输入q个询问,每个询问包含四个整数x1, y1, x2, y2,表示一个子矩阵的左上角坐标和右下角坐标。对于每个询问输出子矩阵中所有数的和。输入格式第一行包含三个整数n,m,q。接下来n行,每行包含m个整数,表示整数矩阵。接下来q行,每行包含四个整数x1, y1, x2, y2,表示一组询问。输出格式共q行,每行输出一个询问的结果。数据范围1≤n,m≤10001≤n,m≤1000,1≤q≤2000001≤q≤200000,1≤x1≤x2≤n1≤x1≤x2≤原创 2021-04-16 23:08:58 · 345 阅读 · 0 评论 -
795.前缀和
数组元素 a1,a2,a3…an。前缀和:Si=a1+a2+a3+a4+a5+a6…+ai(i<=n) S0=0时间复杂度O(n)作用快速求出原数组里一段数字的和 [l,r] al—ar和为Sr-S(l-1)下标从1开始 方便处理边界 Sr-Sl-1=S10-S0 (1,10)主要理解思想题目描述输入一个长度为n的整数序列。接下来再输入m个询问,每个询问输入一对l, r。对于每个询问,输出原序列中从第l个数到第r个数的和。输入格式第一行包含两个整数n和m。第二行包含n个整数原创 2021-04-16 17:22:29 · 64 阅读 · 0 评论