首页 > 其他分享 >2024.3.9 笔记

2024.3.9 笔记

时间:2024-03-09 11:00:23浏览次数:26  
标签:2024.3 val min int MAX 笔记 st 权值

2024.3.9 笔记

P1948

题目大意为在无向图上求出从 \(1\) 到 \(N\) 的路径,使路径上第 \(k+1\) 大的边权尽量少。

第一种是 DP 用\(f[i][j]\) 表示从 \(1\) 到点 \(i\),用了 \(j\) 条免费线的最小花费。

对于一条 \(u -> v\) 的边 \(e\) 有转移:

不用免费线 \(f_{v,k}=min(f_{v,k},max(f_{u,k},c[e]))\)

用免费线 \(f_{v,k+1}=min(f_{v,k+1},f_{u,k})\)

第二种方法是二分答案双端队列 bfs

将原问题转化,是否存在一种合法的升级方法,使话费不超过 mid

现在考虑将升级价格大于 mid 的电缆看做长度为 1 的边,把升级价格不超过 mid 的电缆看做长度为 0 的边,求从 1 到 N 的最短路是否不超过 K 即可。复杂度为 \(O((N+P)log\) \(MAX_L)\)

P4568

经典分层图板子题了,用边权为 0 的边把各层连接起来正常跑最短路就可以了。

P1073

题目大意为在一张节点带有权值的图上找出一条从 1 到 \(n\) 的路径,使路径上能选出两个点 \(p,q\) 并且“节点 \(q\) 的权值减去节点 \(p\) 的权值最大”

可以考虑建一个正图和一个反图,先正向跑 SPFA,求出 \(D\) ,\(D[x]\) 表示从 \(1\) 到 \(x\) 的所有路径中,能够经过的权值最小的节点的权值。同理的,在反图中求出 \(F\),记录最大。即可求出答案。

代码:

int d[MAX_N]/*前缀min*/, f[MAX_N]/*后缀max*/;
bool v[MAX_N]; // 点是否在队列中

// 求d数组,从st出发,只有标记为z和2的边可以用
void spfa(int *g, int st, int z)
{
	g[st] = a[st];
	q.push(st);
	v[st] = true;
	while (!q.empty()) 
	{
		int x = q.front();
		q.pop();
		v[x] = 0;
		for (rint i = h[x]; i; i = ne[i])
			if (w[i] == z || w[i] == 2) 
			{
				int y = v[i];
				int val = z == 1 ? min(g[x], a[y]) : max(g[x], a[y]);
				if (z == 1 && g[y] > val || z == -1 && g[y] < val) 
				{
					g[y] = val;
					if (!v[y]) q.push(y), v[y] = 1;
				}
			}
	}
}

int main() 
{
	cin >> n >> m;
	for (rint i = 1; i <= n; i++) cin >> a[i];
	for (rint i = 1; i <= m; i++) 
	{
		int x, y, z;
		cin >> x >> y >> z;
		add(x, y, z);
		add(y, x, z == 1 ? -1 : z);
	}
	memset(d, 0x3f, sizeof(d));
	spfa(d, 1, 1); // 从1出发求前缀min(d),只有1和2的边可以用
	memset(f, 0xcf, sizeof(f));
	spfa(f, n, -1); // 从n出发倒着求后缀max(d),只有-1和2的边可以用
	int ans = 0;
	for (int i = 1; i <= n; i++) ans = max(ans, f[i] - d[i]);
	cout << ans << endl;
}

P3008

直接 SPFA + SLF 可以过

正解的话则考虑优化,刚开始先只把双向边加入到图中,用深度优先遍历划分图中的联通块。统计每个联通块的总入度。然后跑 Dijkstra 和 拓扑就可以了。

标签:2024.3,val,min,int,MAX,笔记,st,权值
From: https://www.cnblogs.com/spaceswalker/p/18062391

相关文章

  • MYSQl学习笔记19: 外键约束
    外键约束用来让两张表的数据之间建立连接,从而保证数据的一致性和完整性具有外键的表(emp)称为子表外键关联的表(dept)称为父表外键约束创建表时添加createtable表名(字段名数据类型,[constrain][外键名称]foreignkey(外键字段名)references主表(主表......
  • MYSQL学习笔记20: 外键约束(删除/更新行为)
    外键约束删除/更新行为setdefault在mysql的默认引擎innodb中不支持CASCADEaltertable表名addconstraint外键名称foreignkey(外键字段)references主表名(主表字段名)onupdatecascadeondeletecascade;建立外键约束#如果父表和子表建立外键的字段有不同的......
  • MYSQL学习笔记17: 流程控制函数(IF, CASE)
    流程控制函数(IF,CASE)ifselectif(true,'ok','error');selectif(false,'ok','error');/*相当于iftrue:ok;else:error;*/ifnullselectifnull('ok','default');selectifnull(......
  • MYSQL学习笔记18: 约束
    约束约束是作用于表中字段上的规则,用于限制存储在表中的数据.保证表中的正确性,有效性和完整性约束作用于表中字段上,可以在建表和修改表时为表添加约束按照需求创建表,并创建约束createtableusers(idintprimarykeyauto_incrementcomment'主键',n......
  • MYSQL学习笔记15: 数值函数
    数值函数ceil向上取整(并不是四舍五入)selectceil(1.5);selectceil(2.1);floor向下取整selectfloor(3.9);selectfloor(2.0);mod取模(余数)selectmod(7,4);rand0-1的随机小数,不包括0和1selectrand();round四舍五入#参数2:保留的......
  • MYSQL学习笔记16: 日期函数
    日期函数返回当前日期selectcurdate();返回当前时间(24小时制)selectcurtime();返回当前日期+时间selectnow();YEAR,MONTH,DAY获取当前时间对应的年月日selectyear(now());selectmonth(now());selectday(now());在制定日期上增加时间后的日期......
  • MYSQL学习笔记9: DQL排序查询(升降序)
    DQL排序查询select字段列表from表名orderby字段1排序方式1,字段2排序方式2;排序方式ASC升序(默认)DESC降序如果是多字段排序,第一个字段值相同,会根据第二个字段的值进行排序,以此类推按年龄降序排序select*fromworkersorderbyagedesc;......
  • MYSQL学习笔记10: DQL分页查询(利用limit)
    DQL分页查询(利用limit)select字段列表from表名limit起始索引,查询记录数;起始索引从0开始,起始索引=(查询页码-1)*每页显示记录数分页查询是数据库的方言,不同数据库有不同的实现,MYSQL中是LIMIT如果查询的是第一页的数据,起始索引可以省略,直接简写为l......
  • MYSQL学习笔记12: DCL数据控制语言(用户操作)
    DCL数据控制语言查询用户#用户信息保存在数据库mysql的user表中usemysql;select*fromuser;创建用户createuser'用户名'@'主机名'identifiedby'密码';在主机localhost创建一个新用户createuser'hikari39'@'localhost'identifiedby'123456......
  • MYSQL学习笔记13: DCL权限控制(用户权限操作)
    DCL权限控制查询权限showgrantsfor'用户名'@'主机名';查询某个用户的权限showgrantsfor'hikaru39'@'localhost';授予权限grant权限列表on数据库名.表名to'用户名'@'主机名';授予某个用户权限#all,给予数据库itcast中所有表的权限grantallonitcast......