当前位置: 首页 > news >正文

【刷题笔记】日照集训 Day4

T3

有一个 \(n\)\(m\) 边的简单无向图,每个点有颜色 \(c_i\) 和点权 。
经过某个点时需要花费 \(w_i\) 的能量放下一个标记,若 \(c_i\ne c_j\) 则在 \(i\) 处可远程回收 \(j\) 处的标记,要求每刻能量非负,求对任意两点 \(x\)\(y\) 的最小初始能量,若不存在输出 \(-1\)

注意到 性质:在每一个点能回收标记就回收标记,所以一定是走上一段相同颜色的,然后换一种颜色,把先前的标记都回收了,然后再沿着当前颜色走。
第一反应:设 \(f_{i,j}\) 表示任意两点这间的 \(\min (\max(路径上一段相同颜色的距离))\),但是这样发现很难转移。
于是:设 \(f_{i,j}\) 表示 只走同一种颜色,任意两点之间的答案,\(g_{i,j}\) 表示 不同颜色,两点间的答案,\(ans_{i,j}\) 表示两点之间的答案。

初始化:

  • $f_{i,j} =w_i + w_j (c_i == c_j) $
  • \(g_{i,j} = \min(f_{i,k} + w_j) (c_k\ne c_j)\) (这样可以保证转移时只涉及 \(\min,\max\) 操作,不涉及相加操作)

转移:

  • \(f_{i,j} = \min(f_{i,k} + f_{k,j} - w_k)\)(需要把重复算的减去)
  • \(g_{i,j} = \min(\max(g_{i,k}, g_{k,j}))\)(floyd)
  • \(ans_{i,j} = min(f_{i,j}, g_{i,j}, \max(g_{i,k}, f_{k,j}))\)(可以只走相同的,也可以只走不同的,也可以在不同的后面再接一段相同的)

code

#include<bits/stdc++.h>
#define int long long
#define N 510
#define pb push_back
#define Fo(a, b) for(auto a : b)
#define fo(a, b, c) for(int b = a; b <= c; b++)
using namespace std;
int n, m, c[N], w[N], T;
int f[N][N], g[N][N], ans[N][N];
vector<int>G[N];
signed main(){//freopen("ex_graph2.in", "r", stdin);//freopen("graph.out", "w", stdout);ios::sync_with_stdio(0);cin.tie(0); cout.tie(0);cin >> T;while(T--){cin >> n >> m;fo(1, i, n) cin >> c[i];memset(f, 0x3f, sizeof(f)); fo(1, i, n){cin >> w[i]; f[i][i] = w[i];}fo(1, i, n) G[i].clear();fo(1, i, m){int x, y; cin >> x >> y;G[x].pb(y), G[y].pb(x);if(c[x] == c[y]) f[x][y] = f[y][x] = w[x] + w[y];}fo(1, k, n) fo(1, i, n) fo(1, j, n){f[i][j] = min(f[i][k] + f[k][j] - w[k], f[i][j]);}memset(g, 0x3f, sizeof(g));fo(1, i, n) fo(1, j, n) Fo(v, G[j]){if(c[v] != c[j]) g[i][v] = min(g[i][v], f[i][j] + w[v]); }fo(1, k, n) fo(1, i, n) fo(1, j, n){g[i][j] = min(g[i][j], max(g[i][k], g[k][j]));}memset(ans, 0x3f, sizeof(ans));fo(1, i, n) fo(1, j, n){ans[i][j] = min(f[i][j], g[i][j]);fo(1, k, n) ans[i][j] = min(ans[i][j], max(g[i][k], f[k][j]));}fo(1, i, n){fo(1, j, n) cout << ans[i][j] << ' ';cout << "\n";}}return 0;
} 
http://www.sczhlp.com/news/11530/

相关文章:

  • 三分钟答辩稿、高频答辩问答【附论文答辩PPT模板】
  • activiti工作流发起时出现事务冲突的解决方案
  • Java集合——13.使用Stack
  • P1004 [NOIP 2000 提高组] 方格取数题解
  • 蓝牙耳机连接电脑解决方法
  • 组合计数学习笔记
  • 开源中国:以本土化创新驱动中国企业数字化转型新范式
  • 自动化测试三大等待时间(强制等待,显示等待,隐式等待)
  • 厉害!Claude Code 可视化工具来了!!
  • PostgreSQL 常用命令行工具
  • 虚谷数据库JSON处理
  • 【AEBMR出版】第七届经济管理与文化产业国际学术会议(ICEMCI 2025)
  • 【ACM出版】第四届信息经济、数据建模与云计算国际学术会议(ICIDC 2025)
  • 数据出境传输合规指南:企业必知的一个技术方案
  • Tarjan
  • 【ACM出版】2025年仿真、建模与大数据国际学术会议(SMBD 2025)
  • 如何使用3D打印技术制作拉布布模型?
  • mqtt配置使用
  • 形式幂级数实用方法
  • 2-SAT
  • 【CAPL】applILTxPending: CAN报文发送前的字节预处理
  • Java集合——12.使用Deque
  • 工具 - Microsoft Edge浏览器安装ES Header扩展工具
  • 【ACM出版|见刊快】第八届计算机信息科学与人工智能国际学术会议(CISAI 2025)
  • 2025年人工智能与计算工程国际学术会议(AICE 2025)
  • 全球化布局的企业为何纷纷选择上海斯歌?核心优势揭秘
  • 高并发系统设计
  • 电脑开机后内存使用率较高
  • 从经典产品看大模型方向
  • 豆豆守护怎么下载?