yy

NOIP模拟测试29(A)

半城伤御伤魂 提交于 2019-11-28 06:21:06
T1:   题目大意:有一张有向无环图,第$x$次经过边$i$的代价为$a_ix+b_i$,最多经过$c_i$次,起点为1,$s$个点可作为终点,求走$k$次的最小代价。   我们新建一个汇点,将所有可做为终点的边到汇点连边,那么本题便成为了费用流模型。   贪心策略为:每次走最短路。   证明:路径的顺序是可以改变的,设每次走的路径代价是递增的,如果当前不走最短路,那么以后不可能有一条路能将代价追回,所以当前走最短路一定最优。   但是每次增广代价是不同的,我们只能进行完一次增广之后立即修改边权。   考虑EK,每次用spfa找一条代价最小的增广路,并更新费用即边权,若当前边是正向边,则将正向边权加$a_i$,反向边权减$a_i$,反之将正向边权减$a_i$,反向边权加$a_i$。正向边初始权值为$a_i+b_i$,由于反向边退流退的是上一层的费用,所以初值应赋为$-b_i$。   然后增广k次,若流量不能达到k,输出-1。    spfa复杂度视为$O(NM)$ 时,时间复杂度$O(NMK)$,但远远达不到。 Code: 1 #include<iostream> 2 #include<cstdio> 3 #include<queue> 4 using namespace std; 5 const int N=1010; 6 const int M=20010; 7 const

带符号的整数做减法

Deadly 提交于 2019-11-28 02:08:28
View Code #include < iostream > using namespace std; char a[ 1001 ] ; char x_a[ 1001 ] , y_b[ 1001 ] ; char xx[ 1001 ] , yy[ 1001 ]; char x1[ 1001 ] , y1[ 1001 ]; int Lx , Ly ; int sum[ 1001 ] ; int num ; int sign = 0 ; int mark_x , mark_y ; int x[ 1001 ],y[ 1001 ]; void Init_A() // 将字符转化为数字 { int i; for ( i = 0 ; i < Lx ; i ++ ) x[i] = x_a[i] - ' 0 ' ; for ( i = 0 ; i < Ly ; i ++ ) y[i] = y_b[i] - ' 0 ' ; } void Init_S() { int i; for ( i = 0 ; i < Lx ; i ++ ) x1[Lx - i - 1 ] = x_a[i] ; for ( i = 0 ; i < Ly ; i ++ ) y1[Ly - i - 1 ] = y_b[i]; strcpy(x_a , x1); strcpy(y_b , y1); Init_A(); } void

[SHOI2002]滑雪

こ雲淡風輕ζ 提交于 2019-11-27 21:14:36
记忆化搜索$||dp||$剪枝 先讲方法,代码待会上 方法一:记忆化搜索 这个方法不怎么解释,就是每搜索完一个高度的最长路径记录一下,以后搜索其他的点时如果走到了这条路就直接用记录的值计算就是了 方法二:$dp$ 假设一个点的高度为H,周围四个点的高度分别为$H1$,$H2$,$H3$,$H4$,$f[i][j]$代表从$(i,j)$滑的最长长度。如果$H$大于周围四个点的一个,那么就可以滑到那一个点,也就是$f$[高的那个点]=$f$[矮的那个点]$+1$,到这里就不难写出状态转移方程了:$f[i][j]=f[i+b[g]][j+c[g]]+1$(前提:$a[i+b[g]][j+c[g]]<a[i][j]$),其中$a$数组为读入的高度,$b$、$c$数组为方向数组,$f$数组为这个点的最长路径长度。注意在计算长度之前要先将高度排序,然后再来算 方法3:剪枝 假如说当前的最大高度为$maxn$,搜索函数里的参数$num$(代表当前已经走过的长度),当前这个点的高度为$height$。如果$num+height<=maxn$,那么可以直接$return$(注意:这里我还没有枚举周围四个点)。假设你从这个点可以一路无阻碍的走到$1$(也就是最优的情况),那么从这个点走的长度为$height$。但是如果已经走的长度加上从这个点的最优长度都小于等于最大长度的话,那么搜下去肯定是毫无意义的

LeetCode 1091. 二进制矩阵中的最短路径

自作多情 提交于 2019-11-26 10:18:08
在一个 N × N 的方形网格中,每个单元格有两种状态:空(0)或者阻塞(1)。 一条从左上角到右下角、长度为 k 的畅通路径,由满足下述条件的单元格 C_1, C_2, ..., C_k 组成: 相邻单元格 C_i 和 C_{i+1} 在八个方向之一上连通(此时,C_i 和 C_{i+1} 不同且共享边或角) C_1 位于 (0, 0)(即,值为 grid[0][0]) C_k 位于 (N-1, N-1)(即,值为 grid[N-1][N-1]) 如果 C_i 位于 (r, c),则 grid[r][c] 为空(即,grid[r][c] == 0) 返回这条从左上角到右下角的最短畅通路径的长度。如果不存在这样的路径,返回 -1 。 🔗 https://leetcode-cn.com/problems/shortest-path-in-binary-matrix 迷宫的最短路题目: BFS解题 class Solution { public: int shortestPathBinaryMatrix(vector<vector<int>>& grid) { const int N = 105; queue<pair<int,int>>q; int visited[N][N]; memset(visited,0,sizeof visited); if (grid[0][0])