题面

传送门: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. 【题解】SP10570 【LONGCS - Longest Common Substring】

    \(\color{Red}{Link}\) \(\text{Solution:}\) 还是\(\text{Suffix Tree.}\) 根据\(\color{Blue}{Link}\)我们可以得到一 ...

  2. 101 01 Android 零基础入门 02 Java面向对象 03 综合案例(学生信息管理) 02 案例分析及实现 05 通过方法实现学生类与专业类关联——方案二

    101 01 Android 零基础入门 02 Java面向对象 03 综合案例(学生信息管理) 02 案例分析及实现 05 通过方法实现学生类与专业类关联--方案二 本文知识点:通过方法实现学生类与 ...

  3. 全方位剖析 Linux 操作系统,太全了!!!

    Linux 简介 UNIX 是一个交互式系统,用于同时处理多进程和多用户同时在线.为什么要说 UNIX,那是因为 Linux 是由 UNIX 发展而来的,UNIX 是由程序员设计,它的主要服务对象也是 ...

  4. shell-整数测试多范例多生产案例举例

    1. 整数测试举例范例1:整数条件测试举例 root@test-1 ~]# a1=10;a2=13 [root@test-1 ~]# echo $a1 $a2 10 13 [root@test-1 ~ ...

  5. 蒲公英 · JELLY技术周刊 Vol.25 · Webpack 5 正式发布,你学废了么

    蒲公英 · JELLY技术周刊 Vol.25 阔别两年,Webpack 5 正式发布了,不仅清理掉很多冗余的功能,同样也为我们带来了很多新鲜的能力,不论是默认开启的持久缓存,还是反病毒保护,亦或者被其 ...

  6. GML与KML的区别

    1.GML是基于XML的地理信息的传输.存储编码,它包括空间的和非空间的地理特征和地理范畴.GML是空 间数据编码.传输.存储.发布的国际标准KML是一个OGC标准 2.GML专注于地理信息的结构与内 ...

  7. MeteoInfoLab脚本示例:Streamline流线图

    绘制Stramline流线图的函数是streamline,需要两个变量(U/V分量或者风向/风速).脚本程序: f = addfile('D:/Temp/GrADS/model.ctl') u = f ...

  8. MeteoInfoLab脚本示例:Trajectory

    示例读取HYSPLIT模式输出的气团轨迹数据文件,生成轨迹图层,并显示轨迹各节点的气压图.脚本程序: f = addfile_hytraj('D:/MyProgram/Distribution/jav ...

  9. centos8使用systemctl管理运行级别

    一,什么是systemd的target? 1,关于systemd/systemctl的相关知识,请移步到这一篇 https://www.cnblogs.com/architectforest/p/12 ...

  10. linux下composer安装

    curl -sS https://getcomposer.org/installer | php mv composer.phar /usr/local/bin/composer执行更新compose ...