Problem D
很巧妙的思维题

题意

给你一张 n ( n ≤ 500 ) n(n\leq 500) n(n≤500) 个点, m ( m ≤ 2.5 e 5 ) m(m\leq2.5e5) m(m≤2.5e5) 条带权无向边的图。你的目标是从 1 走到 n。
你可以进行如下操作任意次:

  1. 对于边 ( u , v , w ) (u, v, w) (u,v,w) ,你可以任意选择一个与 u u u 点间存在边的点 t t t ( t t t 可以等于 u u u ,即可以自环) ,花费 w w w 时间将原边更改为 ( u , t , w ) (u, t, w) (u,t,w) 。即将与 v v v 相连改为与 t t t 相连。

问:从 1 到 n n n 的最短时间,时间 = 修改边花费的时间 + 最终从 1 走到 n n n 的路径长度。

思路

假设我们现在已经通过进行若干次操作,找到了最优解对应的最后的图。那么这个路径一定满足以下条件:

  1. 1 1 1 到 n n n 的路径上的每条边权值相同。
  2. 在上述结论的基础上,我们可以将这些边合成为 1 → n \to\ n → n 的一条边。

证明:对于1,假设某个点连接的两条边权值不同,我们可以通过一次操作将其合并成一条边,权值为 m i n ( w 1 , w 2 ) × 2 min(w_1,w_2)\times 2 min(w1​,w2​)×2 ,因此一定相同。条件2也类似,把 k k k 条权值为 w w w 的边合并成 1 1 1 条边与不合并花费相同。
于是猜测最终答案可能和路径上边的数量以及路径上最短路长度有关。(因为长的边可以被短的替代)
首先我们用 floyd 算法求出任意两点间最少经过多少条边,然后可以枚举每条边是否是最终的 w w w 。
考虑如何从 1 → n 1\to n 1→n ,有两种方式

  1. 对于 ( u , v , w ) (u, v, w) (u,v,w) ,如果 u u u 可达 1 1 1 , v v v 可达 n n n ,那么可以通过 1 → u → v → n 1\to u\to v\to n 1→u→v→n
    到达。 u , v u,v u,v 互换也类似。
  2. 第二种比较难想,对于边 ( u , v , w ) (u, v, w) (u,v,w) ,该边先通过操作到达了某个点 i i i 完成了一个自环,形成自环的操作数等于该边到这个点的最短距离+1,最终路径是 1 → i → n 1\to i\to n 1→i→n ,然后 i i i 上的这个自环扩增的操作数为1 + i i i 到 1 1 1 和 i i i 到 n n n 的距离,通过枚举 i = 1 → n i = 1\to n i=1→n 即可。

代码

int n, m;
int f[N][N];
int u[maxm], v[maxm], w[maxm];
void solve() {cin >> n >> m;for(int i = 1; i <= m; i++) {cin >> u[i] >> v[i] >> w[i];}for(int i = 1; i <= n; i++) {for(int j = 1; j <= n; j++) {f[i][j] = n + 1;}f[i][i] = 0;}for(int i = 1; i <= m; i++) {f[u[i]][v[i]] = f[v[i]][u[i]] = 1;}for(int k = 1; k <= n; k++) {for(int i = 1; i <= n; i++) {for(int j = 1; j <= n; j++) {f[i][j] = min(f[i][j], f[i][k] + f[k][j]);}}}ll ans = 2e18;for(int i = 1; i <= m; i++) {ans = min(ans, 1ll * w[i] * (f[1][u[i]]+f[v[i]][n] + 1));ans = min(ans, 1ll * w[i] * (f[1][v[i]]+f[u[i]][n] + 1));for(int k = 1; k <= n; k++) {ans = min(ans, 1ll * w[i] * (f[v[i]][k]+1+f[k][1]+f[k][n]+1));ans = min(ans, 1ll * w[i] * (f[u[i]][k]+1+f[k][1]+f[k][n]+1));}}cout << ans << endl;
}

D. Ela and the Wiring Wizard floyd/思维相关推荐

  1. D. Ela and the Wiring Wizard(最短路径/floyd)

    题目 参考 题意 给定一个带权无向图,n个点,m条带权无向边. 要从点1走到点n. 走之前,可以执行以下操作 对于连接点u,v,边权为w的边,可以将它从点u移除,并连接到任意一个与v相邻的点(点v也可 ...

  2. D. Ela and the Wiring Wizard codeforces 1737D

    Problem - D - Codeforces 题目大意:有一个n个点m条边的图,(可能有重边),现可以选择任意一条边,使其与一个点断开连接,并连接该点的一个相邻点(可以自己对自己连边),费用为边权 ...

  3. 开发工具快速下载地址

    MAVENJDK 查看全文 http://www.taodudu.cc/news/show-6407206.html 相关文章: BT开源项目Snark源码分析 开源软件之许可证(三) BT种子制作教 ...

  4. 【2018icpc宁夏邀请赛现场赛】【Gym - 102222F】Moving On(Floyd变形,思维,离线处理)

    https://nanti.jisuanke.com/t/41290 题干: Firdaws and Fatinah are living in a country with nn cities, n ...

  5. 【图论】用一道题从本质上讲清楚Floyd算法

    P1119 [灾后重建] 4 5 1 2 3 4 0 2 1 2 3 1 3 1 2 2 1 4 0 3 5 4 2 0 2 0 1 2 0 1 3 0 1 4 -1 -1 5 4 一道非常好的Flo ...

  6. 人活着系列之芳姐和芳姐的猪(Floyd)

    http://acm.sdut.edu.cn/sdutoj/problem.php?action=showproblem&problemid=2929 这个题一方面数据水,另一方面就是思维水, ...

  7. 坐在马桶上看算法:只有五行的Floyd最短路算法

    坐在马桶上看算法:只有五行的Floyd最短路算法 此算法由Robert W. Floyd(罗伯特·弗洛伊德)于1962年发表在"Communications of the ACM" ...

  8. 牛客 - 双流机场(思维)

    题目链接:点击查看 题目大意:给出一个n*m的有向图,每一行和每一列的方向都是相同的,现在给出每一行和每一列的方向,问给出的图是不是一个强联通图 题目分析:这个题目之前做过数据很小的版本,当时那个题目 ...

  9. CodeForces - 475B Strongly Connected City(最短路+判断强联通图/思维)

    题目链接:点击查看 题目大意:给出n和m然后给出n条横向街道和m条纵向街道,总共包括了n*m个结点,每条街道都是单向通道,问该图是否能够组成强联通图(有向图中任意两点间都存在路径) 题目分析:乍一看没 ...

最新文章

  1. numpy.ndarray的赋值操作
  2. BZOJ2490 Zombie’s Treasure Chest
  3. docker内手动安装python环境
  4. java注释类型_Java 8类型注释
  5. centos linux asp,CentOS 7.4 下 如何部署 AspNetCore 结合 consul
  6. Python画数码晶体管日期(年月日时分秒)
  7. 【交易所相关】网关、席位、交易单元
  8. 2021-07-28-飞桨课程笔记-关于数据获取途径与处理方面的技巧
  9. Android 使用Alarm机制创建长时间在后台运行的定时任务
  10. Json Web Token(JWT)
  11. 苹果怎么换自定义铃声?不用电脑也能搞定!
  12. TPAMI 2022 :Multi-task Learning with Coarse Priors for Robust Part-aware Person Re-identification
  13. 布隆过滤器(Bloom Filter)初探
  14. python pycrypto 加密解密
  15. 检出三聚氰胺婴幼儿配方乳粉企业名单
  16. 计算机的使用英语作文,关于电脑作用英语作文
  17. php判断股票涨停,从股票压力位的角度判断涨停板的高度(图解)
  18. 3D绘图 WebGl引擎----ThreeJS 3D渲染引擎
  19. Filecoin系列 - FVM
  20. STC单片机和STM32单片机哪个更适合入门?

热门文章

  1. TSC条码打印机函数使用
  2. ibili的使用教程
  3. 无需越狱,iPhone修改应用通知气泡颜色
  4. Collection.sort()方法
  5. java版文本切割器
  6. Artifact storage:war exploded: Error during artifact deployment. See server log for details 之一种解决方法
  7. 32位PCI转CPCI转接板
  8. 工业控制领域电子元件国产化硬件设计替代解读
  9. C练题笔记之:Leetcode-662. 二叉树最大宽度
  10. 透过微博回港上市,看中概股如何穿越市场周期变动