首页 > TAG信息列表 > inq
差分约束系统 学习笔记
第4章 差分约束系统 算法简述 核心思想:将题目给定条件转化为形如\(s[i] - s[j] <= k\)的三角形不等式,然后用最短路求解 解题要点:感觉还是<=跑最短路好写点,据此, 在取\(a[i] - a[j] <= k\)的形式时,规则如下: 差分约束跑最短路,跑出的结果是所有解中的最大解 差分约束跑最长路,跑出的结G - Reducing Delivery Cost -最短路
G - Reducing Delivery Cost 题意: 给你n个点和m条边以及每条边的权值 允许让一条边的权值变成0 然后有q次询问 求q次询问的xi到yi的最小路径和 思路: 显然是最短路的题 但是直接套最短路模板 枚举每条免费的边然后再dij每个点 来求 时间复杂度 是 n* m * k * log(m)会超时 所第24题:一马当先
题目描述: 下过象棋的人都知道,马只能走’日’字形(包括旋转90°的日),现在想象一下,给你一个n行m列网格棋盘, 棋盘的左下角有一匹马,请你计算至少需要几步可以将它移动到棋盘的右上角,若无法走到,则输出-1. 如n=1,m=2,则至少需要1步;若n=1,m=3,则输出-1。 示例: 输入: n = 1 m = 2 输出: 1P3371 【模板】单源最短路径(弱化版)
题目背景 本题测试数据为随机数据,在考试中可能会出现构造数据让SPFA不通过,如有需要请移步 P4779。 题目描述 如题,给出一个有向图,请输出从某一点出发到所有点的最短路径长度。 输入格式 第一行包含三个整数 n,m,sn,m,s,分别表示点的个数、有向边的个数、出发点的编号。 接下来最短路
单源最短路 SPFA 队列优化 Bellman-Ford 算法 。 关于 SPFA ,他死了 。 时间复杂度 \(O(nm)\) (容易被卡,不太稳定) 如何判断负环: 用 SPFA ,设 \(cnt[i]\) 表示 \(1\) 到 \(i\) 的最短路条数。松弛一条边的时候用 \(cnt[u]+1\) 来更新 \(cnt[v]\) ,若 \(cnt[v]\ge n\) 则说明出现了负环餐巾计划问题
题面 餐巾计划问题 题解 隐式图问题。 我们考虑建立分层图,那么每层的状态即为时间,将每天拆成两个点,分别表示早上和晚上。 从源点向表示晚上的点连流量为当天所用餐巾数 \(r_i\),费用为 \(0\) 的边,表示每天晚上得到 \(r_i\) 条脏餐巾。 从表示早上的点向汇点连流量为当天所用餐巾数最短路径SPFA
SPFA 即用队列处理Bellman-Ford。 效率很高,与BFS很像。但不稳定,题目规模很大,且边的权值为非负数时使用Dijkstra算法更好,不宜使用SPFA。 SPFA链式前向星 2544 代码 #include<bits/stdc++.h> using namespace std; #define N 1000010 #define INF 0xfffffff int n,m,a,b,c,dis[图的bfs遍历模板(邻接矩阵存储和邻接表存储)
bfs遍历图模板伪代码: 1 bfs(u){ //遍历u所在的连通块 2 queue q; 3 //将u入队 4 inq[u] = true; 5 while (q非空){ 6 //取出q的队首元素u进行访问 7 for (从u出发可达的所有的顶点v){ 8 if (inq[v] == false){P3980 [NOI2008] 志愿者招募 题解
P3980 [NOI2008] 志愿者招募 无源汇上下界最小费用流。 /* { ###################### # Author # # Gary # # 2021 # ###################### */ #include<bits/stdc++.h> #define rb(a,b,c) for(int a=b;a<=c;++a) #define rl(a,b,c) fo算法笔记-BFS-迷宫问题
迷宫问题 代码: #include <bits/stdc++.h> /* 5 5 ..... .*.*. .*S*. .***. ...T* 2 2 4 3 */ using namespace std; struct node{ int x; int y; int step; }S, T, Node; const int maxn = 100; int n, m; char matrix[maxn][maxn]; bool inq[maxn][maloj10087
Southwestern Europe 2002,题面可参考 POJ 1201。 给定 n 个闭区间 [a_i,b_i] 和 n 个整数c_i 。你需要构造一个整数集合Z ,使得对于任意i (1<=i<=n),Z 中满足 a_i<=x<=b_i 的整数 x 不少于 c_i 个,求这样的整数集合 Z 最少包含多少个数。 简而言之就是,从 0~5E4 中选出尽量少的整数,浅谈差分约束
浅谈差分约束 1.定义: 如果一个系统由\(n\)个变量和\(m\)个约束条件组成,并且条件都为形如\(a_i-a_j\le k\)的不等式,则称其为差分约束系统。 差分约束系统是一种特殊的\(n\)元一次不等式组,每个约束条件都为两个变量作差构成。 2.模型转换: 求解差分约束系统,可以转化成图Python爬取豆瓣Top250电影信息
1、爬取豆瓣Top250电影信息以文本形式保存 数据:豆瓣电影 2、代码 import requests from bs4 import BeautifulSoup def get_movie(): headers = { 'user-agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626最短路
升降梯上 内存限制:128 MiB 时间限制:1000 ms 标准输入输出 题目描述:开启了升降梯的动力之后,探险队员们进入了升降梯运行的那条竖直的隧道,【算法】最短路 - SPFA
SPFA 即队列优化过的Bellman-Ford算法,可以处理带负权图。 应用于单源最短路。 此外还可以进行负权环的判定,即若第n次操作仍可降低花费,则一定存在负权环。 //Bellman-Ford算法 for (int i = 0; i < n; i++) d[i] = INF; d[0] = 0; for (int k = 0; k < n - 1; k++) {//迭代n-1次[SCOI2011] 糖果
差分约束系统: 正向建 \(B-A\ge C\) 为 \(A\rightarrow B\) 权 \(C\),求最长路。 或反向建 \(B-A\ge C\) 为 \(B\rightarrow B\) 权 \(-C\),求最短路。 均只能用 SPFA 做。注意判环! #include <cstdio> #include <cstring> #include <algorithm> #include <queue> using naCF786B Legacy 线段树优化建图
CF786B Legacy ### 线段树优化建图 Luogu链接 裸题,区间连点,点连区间 假如直接连边跑的话一定会T 这时候就需要线段树优化建图了 两个线段树 一个树是区间连点的,叫out 一个树是点连区间的,叫in 但是两个树内部连边的方向不一样 如图 假如相反必然就不对了包含关系错了 剩下的就好「BZOJ3040」 最短路 - 单源最短路
题意 给定 \(m\) 条有向边,问 \(1\) 到 \(n\) 的最短路 解析 单源最短路径模板 注意细节优化 #include <bits/stdc++.h> using namespace std; typedef pair<int, int> P; const int maxn = 1000010; int n, m, T, cnt, xa, xc, ya, yc, rp, head[maxn], nxt[maxn], d[maxn], inq[Luogu_4644 Cleaning Shifts【题解】最短路代替DP
题面:https://www.luogu.org/problem/P4644 和上一篇题解背景基本一样,就是改成了求最小的花费。 本来应该是通过DP和数据结构优化的。 但是最小花费好像可以用最短路。 将每个时间段用自己的价值连边。 再把每个时间向前一个时间连为0的边。 这样可以保证最多可以跑N个时间段的边,且PAT A1134 Vertex Cover (25 分) 图
题目大意:给出一张图,判断给出的顶点序列是否满足“vertex cover"。所谓"vertex cover",是指图中任意一条边,至少有一个端点被包含在这个顶点序列里。 根据题意,只要图中有一条边,它的两个顶点都不在给出的序列里,那么这个序列就不满足"vertec cover"。反过来,如果不在序POJ-2195(最小费用最大流+MCMF算法)
Going Home POJ-2195 这题使用的是最小费用流的模板。 建模的时候我的方法出现错误,导致出现WA,根据网上的建图方法没错。 这里的建图方法是每次到相邻点的最大容量为INF,而花费为1,因为花费等于距离。但是需要增加一个源点和一个汇点,然后将每个人和源点相连,每个房子和汇点相连,容量都0 or 1 HDU - 4370 (思维+最短路)
Given a n*n matrix C ij (1<=i,j<=n),We want to find a n*n matrix X ij(1<=i,j<=n),which is 0 or 1. Besides,X ij meets the following conditions: 1.X 12+X 13+...X 1n=1 2.X 1n+X 2n+...X n-1n=1 3.for each i (1<i<n), satisfies ∑X ki (1<=k&lPOJ【2253】Frogger(最小最大值)
题目链接:http://poj.org/problem?id=2253 #include<iostream> #include<cstdio> #include<cstring> #include<queue> #include<cmath> using namespace std; #define INF 0x3f3f3f3f const int N = 200 + 10; int n; double a[N][N],d[N],inq[N];POJ3539 Elevator 【同余类最短路】
题目描述: 电梯有n层,开始在1层,每次可以向上升a,b,c层,问可以到达的层数。 n<=1018,1<=a,b,c<=100000 题目分析: 把楼层对a取模,按余数分成a类。同一余数的楼层只要最低的那层可达,其它所有都可达。 所以只需要考虑上升b,c层,求出模a余i的可达的最低的楼层。 设dis[i]dis[i]dis[i]队列例题-连通块
代码如下: 1 #include <iostream> 2 using namespace std; 3 struct Node 4 { 5 int x,y; 6 }; 7 int a[100][100],h,w; 8 //队列 9 struct Queue 10 { 11 Node a[100]; 12 int front; 13 int rear; 14 } q; 15 int n=50;//存实际占用空间为n+1,即0-n。