题面

传送门:https://www.luogu.org/problemnew/show/P1345

]


Solution

这道题,需要一个小技巧了解决。

我相信很多像我这样接蒟蒻,看到这道题,不禁兴奋起来:“这道题是裸的割边,我会做!!!”

然后兴冲冲的打了个DINIC,交一发,80分。

所以说我们有时候还是太naive。

重新读题,会发现这题割的不是边,是点。这样还能80分,数据真水

所以说,我们需要一个割边转割点的小技巧。

我们可以考虑“拆点”,即把一个点拆成两个点,中间连一条边权为1的边

前一个点作为“入点”,别的点连边连入这里

后一个点作为“出点”,出去的边从这里出去

这样,只要我们切断中间那条边,就可以等效于除去这个点

如图:

红色的边边权为1,黑色的边边权为inf。

原点和汇点的内部边权为inf,因为显然这两个点不能删除。

题面给的边删除没意义(因为我们要删点),所以也设为inf(事实上设为1也没问题,因为删除这条边的权值可以理解为删除了一个点)

至于怎么算割边,可以证明割边在数值上等于最大流(本蒟蒻不会证)

至于怎么求最大流........可以参考这个博客:http://www.cnblogs.com/SYCstudio/p/7260613.html

最后记得双倍空间

然后就OjbK了


Code

  1. //Luogu P1345 [USACO5.4]奶牛的电信Telecowmunication
  2. //June,3rd,2018
  3. //割边转割点
  4. #include<iostream>
  5. #include<cstdio>
  6. #include<cstring>
  7. #include<vector>
  8. #include<queue>
  9. using namespace std;
  10. long long read()
  11. {
  12. long long x=0,f=1; char c=getchar();
  13. while(!isdigit(c)){if(c=='-') f=-1; c=getchar();}
  14. while(isdigit(c)){x=x*10+c-'0';c=getchar();}
  15. return x*f;
  16. }
  17. const int N=200+10;
  18. const int inf=0x3f3f3f3f;
  19. struct road
  20. {
  21. int to,w,rev;
  22. road (int A,int B,int C)
  23. {
  24. to=A,w=B,rev=C;
  25. }
  26. };
  27. vector <road> e[N];
  28. int n,m,c1,c2,depth[N];
  29. queue <int> dl;
  30. bool bfs()
  31. {
  32. memset(depth,0,sizeof depth);
  33. depth[c1]=1;
  34. dl.push(c1);
  35. while(dl.empty()==false)
  36. {
  37. int now=dl.front();
  38. dl.pop();
  39. for(int i=0;i<int(e[now].size());i++)
  40. if(e[now][i].w>0 and depth[e[now][i].to]==0)
  41. {
  42. depth[e[now][i].to]=depth[now]+1;
  43. dl.push(e[now][i].to);
  44. }
  45. }
  46. if(depth[c2]==0) return false;
  47. return true;
  48. }
  49. int dfs(int now,int f)
  50. {
  51. if(now==c2) return f;
  52. int ans=0;
  53. for(int i=0;i<int(e[now].size());i++)
  54. if(e[now][i].w>0 and depth[e[now][i].to]==depth[now]+1)
  55. {
  56. int temp=dfs(e[now][i].to,min(f,e[now][i].w));
  57. e[now][i].w-=temp;
  58. e[e[now][i].to][e[now][i].rev].w+=temp;
  59. f-=temp,ans+=temp;
  60. if(f==0) break;
  61. }
  62. return ans;
  63. }
  64. int Dinic()
  65. {
  66. int ans=0;
  67. while(bfs()==true)
  68. ans+=dfs(c1,inf);
  69. return ans;
  70. }
  71. inline void AddLine(int s,int t,int w)
  72. {
  73. e[s].push_back(road(t,w,e[t].size()));
  74. e[t].push_back(road(s,0,e[s].size()-1));
  75. }
  76. int main()
  77. {
  78. n=read(),m=read(),c1=read(),c2=read();
  79. for(int i=1;i<=n;i++) e[i].reserve(8);
  80. for(int i=1;i<=n;i++)
  81. if(i==c1 or i==c2)
  82. AddLine(i,i+n,inf);
  83. else
  84. AddLine(i,i+n,1);
  85. for(int i=1;i<=m;i++)
  86. {
  87. int s=read(),t=read();
  88. AddLine(s+n,t,inf);
  89. AddLine(t+n,s,inf);
  90. }
  91.  
  92. printf("%d",Dinic());
  93. return 0;
  94. }

正解(C++)

[Luogu P1345] [USACO5.4]奶牛的电信Telecowmunication (最小割)的更多相关文章

  1. luogu P1345 [USACO5.4]奶牛的电信Telecowmunication

    https://www.luogu.org/problemnew/show/1345 拆点,中间建流量为1的边,跑最小割 #include<cstdio> #include<queu ...

  2. 洛谷P1345 [USACO5.4]奶牛的电信(最小割)

    题目描述 农夫约翰的奶牛们喜欢通过电邮保持联系,于是她们建立了一个奶牛电脑网络,以便互相交流.这些机器用如下的方式发送电邮:如果存在一个由c台电脑组成的序列a1,a2,...,a(c),且a1与a2相 ...

  3. [USACO5.4]奶牛的电信Telecowmunication 最小割

    题目描述 农夫约翰的奶牛们喜欢通过电邮保持联系,于是她们建立了一个奶牛电脑网络,以便互相交流.这些机器用如下的方式发送电邮:如果存在一个由c台电脑组成的序列a1,a2,...,a(c),且a1与a2相 ...

  4. P1345 [USACO5.4]奶牛的电信Telecowmunication

    P1345 [USACO5.4]奶牛的电信Telecowmunication 题目描述 农夫约翰的奶牛们喜欢通过电邮保持联系,于是她们建立了一个奶牛电脑网络,以便互相交流.这些机器用如下的方式发送电邮 ...

  5. 洛谷P1345 [USACO5.4]奶牛的电信Telecowmunication【最小割】分析+题解代码

    洛谷P1345 [USACO5.4]奶牛的电信Telecowmunication[最小割]分析+题解代码 题目描述 农夫约翰的奶牛们喜欢通过电邮保持联系,于是她们建立了一个奶牛电脑网络,以便互相交流. ...

  6. 洛谷——P1345 [USACO5.4]奶牛的电信Telecowmunication

    P1345 [USACO5.4]奶牛的电信Telecowmunication 题目描述 农夫约翰的奶牛们喜欢通过电邮保持联系,于是她们建立了一个奶牛电脑网络,以便互相交流.这些机器用如下的方式发送电邮 ...

  7. 洛谷P1345 [USACO5.4]奶牛的电信Telecowmunication(最小割)

    题目描述 农夫约翰的奶牛们喜欢通过电邮保持联系,于是她们建立了一个奶牛电脑网络,以便互相交流.这些机器用如下的方式发送电邮:如果存在一个由c台电脑组成的序列a1,a2,...,a(c),且a1与a2相 ...

  8. 洛谷 P1345 [USACO5.4]奶牛的电信Telecowmunication

    题目描述 农夫约翰的奶牛们喜欢通过电邮保持联系,于是她们建立了一个奶牛电脑网络,以便互相交流.这些机器用如下的方式发送电邮:如果存在一个由c台电脑组成的序列a1,a2,...,a(c),且a1与a2相 ...

  9. P1345 [USACO5.4]奶牛的电信Telecowmunication【最小割】【最大流】

    题目描述 农夫约翰的奶牛们喜欢通过电邮保持联系,于是她们建立了一个奶牛电脑网络,以便互相交流.这些机器用如下的方式发送电邮:如果存在一个由c台电脑组成的序列a1,a2,...,a(c),且a1与a2相 ...

随机推荐

  1. 软件定义网络实验记录⑤--OpenFlow 协议分析和 OpenDaylight 安装

    一.实验目的 回顾 JDK 安装配置,了解 OpenDaylight 控制的安装,以及 Mininet 如何连接: 通过抓包获取 OpenFlow 协议,验证 OpenFlow 协议和版本,了解协议内 ...

  2. Ajax接收int类型乱码

    在Ajax返回值类型是 "text" 的时候,接收int类型时可能会出现ၧ 解决方法:将int转为String即可 int money =100; String s = Integ ...

  3. C++指针delete后还要置为null

    非常好的一篇说明: 转载:https://blog.csdn.net/qq_36570733/article/details/80043321 众所周知,最开始我们用new来创建一个指针,那么等我们用 ...

  4. 浙大《数据结构》学习&练习(一)算法初步

    1.数据结构是数据在计算机中的组织方式,类比图书在图书馆中的存储,应该如何分类,如何在书架上存取. 2.抽象数据结构是对一类的数据的一种组织方式的通用(抽象)描述,包括类型的名称,数据对象集和操作集. ...

  5. CentOS7 下 swap 分区的创建、删除及相关配置

    一般我们在购买云服务器(例如:阿里云ECS.腾讯云服务器)的时候,选择 CentOS 7 系统之后,登录系统,发现 swap 大小为 0(即没有分配). 如果我们想在该 服务器上安装 Oracle 数 ...

  6. 【开源】Springboot API 一键生成器

    Springboot API 一键生成器 写这个项目,最大的想法就是:不做CRUD 程序猿 Springboot 在我们平时开发项目当中,是如此的常用.然而,比如平时我们写的一些: XX 管理系统 X ...

  7. HTTPS证书知识扫盲

    1. 前言 现在搞网站域名不加个HTTPS就显得不专业,特别在使用JWT进行认证的接口一定要加HTTPS为你的接口增加一层安全屏障.今天就来聊聊配置HTTPS的关键SSL证书,也被称为CA证书. 2. ...

  8. k8s集群添加新得node节点

    服务端操作: 方法一: 获取master的join token kubeadm token create --print-join-command 重新加入节点 kubeadm join 192.16 ...

  9. 写给前端同学的C++入门教程(一):概述和环境搭建

    说明:本人是前端er,因为最近对 UE4(一个游戏开发引擎)产生了兴趣,而这个引擎源开发游戏时需要用到 C++ ,所以就开始入坑 C++ 了.现将自己学习 C++ 的笔记整理并分享出来,以便一些想入门 ...

  10. pytest文档33-Hooks函数获取用例执行结果(pytest_runtest_makereport)

    前言 pytest提供的很多钩子(Hooks)方法方便我们对测试用例框架进行二次开发,可以根据自己的需求进行改造. 先学习下pytest_runtest_makereport这个钩子方法,可以更清晰的 ...