题面

传送门: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

//Luogu P1345 [USACO5.4]奶牛的电信Telecowmunication
//June,3rd,2018
//割边转割点
#include<iostream>
#include<cstdio>
#include<cstring>
#include<vector>
#include<queue>
using namespace std;
long long read()
{
long long x=0,f=1; char c=getchar();
while(!isdigit(c)){if(c=='-') f=-1; c=getchar();}
while(isdigit(c)){x=x*10+c-'0';c=getchar();}
return x*f;
}
const int N=200+10;
const int inf=0x3f3f3f3f;
struct road
{
int to,w,rev;
road (int A,int B,int C)
{
to=A,w=B,rev=C;
}
};
vector <road> e[N];
int n,m,c1,c2,depth[N];
queue <int> dl;
bool bfs()
{
memset(depth,0,sizeof depth);
depth[c1]=1;
dl.push(c1);
while(dl.empty()==false)
{
int now=dl.front();
dl.pop();
for(int i=0;i<int(e[now].size());i++)
if(e[now][i].w>0 and depth[e[now][i].to]==0)
{
depth[e[now][i].to]=depth[now]+1;
dl.push(e[now][i].to);
}
}
if(depth[c2]==0) return false;
return true;
}
int dfs(int now,int f)
{
if(now==c2) return f;
int ans=0;
for(int i=0;i<int(e[now].size());i++)
if(e[now][i].w>0 and depth[e[now][i].to]==depth[now]+1)
{
int temp=dfs(e[now][i].to,min(f,e[now][i].w));
e[now][i].w-=temp;
e[e[now][i].to][e[now][i].rev].w+=temp;
f-=temp,ans+=temp;
if(f==0) break;
}
return ans;
}
int Dinic()
{
int ans=0;
while(bfs()==true)
ans+=dfs(c1,inf);
return ans;
}
inline void AddLine(int s,int t,int w)
{
e[s].push_back(road(t,w,e[t].size()));
e[t].push_back(road(s,0,e[s].size()-1));
}
int main()
{
n=read(),m=read(),c1=read(),c2=read();
for(int i=1;i<=n;i++) e[i].reserve(8);
for(int i=1;i<=n;i++)
if(i==c1 or i==c2)
AddLine(i,i+n,inf);
else
AddLine(i,i+n,1);
for(int i=1;i<=m;i++)
{
int s=read(),t=read();
AddLine(s+n,t,inf);
AddLine(t+n,s,inf);
} printf("%d",Dinic());
return 0;
}

正解(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. 工作流引擎Activiti与SpringBoot2整合--开源软件诞生17

    开源ERP技术整合系列--第17篇 用日志记录"开源软件"的诞生 [点亮星标]----祈盼着一个鼓励 博主开源地址: 码云:https://gitee.com/redragon/r ...

  2. shiro认证流程源码分析--练气初期

    写在前面 在上一篇文章当中,我们通过一个简单的例子,简单地认识了一下shiro.在这篇文章当中,我们将通过阅读源码的方式了解shiro的认证流程. 建议大家边读文章边动手调试代码,这样效果会更好. 认 ...

  3. SPI通信基础学习

    SPI是"Serial Peripheral Interface"的缩写,即"串行外设接口",是摩托罗拉公司推出的一种串行接口通信协议. 接线的示意图: SPI ...

  4. DORIS系统概述

    DORIS(Doppler Orbitography and Radio-positioning Integrated by Satellite)(多普勒轨道学与无线电定位集成卫星),它是由法国Cne ...

  5. P4279 [SHOI2008]小约翰的游戏(Anti_nim)

    Link 题面 题目描述 小约翰经常和他的哥哥玩一个非常有趣的游戏:桌子上有 \(n\) 堆石子,小约翰和他的哥哥轮流取石子,每个人取的时候,可以随意选择一堆石子, 在这堆石子中取走任意多的石子,但不 ...

  6. dubbo使用问题

    新入职此公司, 发现公司使用的框架原来是传说中的分布式的(原谅我以前在传统公司工作,并远离浪潮久矣), 使用过程中发现各服务之间使用 dubbo 进行通信. 特地总结下遇见的坑,为以后总结经验.   ...

  7. 9.Android-读写SD卡案例

    1.效果如下所示: 2.读写SD卡时,需要给APP添加读写外部存储设备权限,修改AndroidManifest.xml,添加: <uses-permission android:name=&qu ...

  8. BigInteger和BigDecimal

    BigInteger BigInteger的作用是对整数做计算,一般的使用String类型初始化BigInteger,它除了封装了基本的加减乘除运算外还提供了signum(),abs()等函数,使用方 ...

  9. python自定义模块引入报错 pycharm

    1.首先进入settings->python console 选择Add source roots to PYTHONPATH 2.然后将自己工程文件夹mark as source root 3 ...

  10. Vue 过滤器入门

    Vue 允许自定义过滤器,可被用于一些常见的文本格式化 过滤器可以用在两个地方:双花括号插值和 v-bind 表达式 过滤器应该被添加在JavaScript表达式的尾部,由"管道" ...