网络吞吐量:最大流

 首先要跑Dijkstra.

然后我的错误思路是记录每个点的Dis能被更新的点,接着边化点,点化边,再跑最大流即可.

大概长这样.

但是思路就卡住了,因为我无法通过bfs找出被同一个点相连的两条边,其实能找到,只不过我判断要是边化点的话,会有200000+个点,若是每个点间连几条边,我不就死了吗.

所以我就不是人般的颓的题解.

正解:考虑每个点的贡献,也是有点相同的思想,只不过将点上的限制转化了.将最短路上的点拆成了两个点,然后其他的正常建,只不过在跑最大流时其他点的边权是Inf,只起到联通性的作用.

然后我就又想错了.我想要从S,T跑两遍Dijkstra,然后如果两种距离相加=1->n的距离,就是最短路的一部分...然后高高兴兴的码完 了...

 

然后又发现思路不对???因为它是双向边吗??

不是的,因为这个点是最短路上的点不一定它的边们就是最短边啊!!

[打完再放代码]...

终于默默的A掉了...但是我很哭哭...

此时的思路是正解(啪

思路,也就是,跑Dijkstra,然后把最短路上的边留下来,之后愉悦的新建一个图就跑最大流就可以了.

但它是有冗余的,因为我只跑了一遍Dijkstra,用贪心策略把所有的较小边留了下来.

具体的说,我判断这个边是否是最短路上的边时是这么判断的:

那么就会出现一个问题:确实,每个点对都只会剩下一条最短边,可是,

这条边一定会用到吗?

不一定会.

因为举个例子,一条链!

然后它就会全部保留!

转载于:https://www.cnblogs.com/hzoi2018-xuefeng/p/11323184.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值