POJ 1966 Cable TV Network (最大流最小割)

$ POJ~1966~Cable~TV~Network $

eMNR0K.png



$ solution: $

第一眼可能让人很难下手,但本就是冲着网络流来的,所以我们直接一点。这道题我们要让这个联通图断开,那么势必会有两个点变得不连通,这道题的数据范围很小,所以我们试着暴力枚举两个点。这样就变成了最小割。不过,嗯?割的东西怎么是点?

为了靠近我们已经学得知识,我们想办法看,能不能割点变成割边。反正网络流最喜欢千变万化、左右建模了。。。于是我们引进书上的一个东西:

  1. 一个节点可以拆成两个节点,将原节点用中间那条边表示
  2. 一条边可以拆成两条边,将原边用中间那个点表示
  3. 中间的边权为1代表这个点是否被割,旁边的边权为inf是为了排除其影响(因为它不可能被割掉)

我们用第一条和第三条性质可以解决这个问题。首先对于每个节点建立两个 $ i $ 和 $ i+n $ 节点。然后这两个节点之间用一条权值为1的有向边(从 $ i $ 到 $ i+n $ ) ,如果这条边在最小割中被割掉(等价于原本的点被割掉)。然后 $ i $ 节点连入边(权值正无穷), $ i+n $ 节点连出边(权值正无穷),连正无穷是为了让割掉的边只能是中间的边。然后我们跑一遍最大流,它对应的最小割里每条代表原来一个点,因为权值为1,所以流量就是答案。

注意:我们的源汇点也要被分为两个点,而网络流中的实际源点是 $ S+n $ ,它连出边。因为源汇点的性质,这两个点不可能被割掉,所以它们中间不连边。



$ code: $

#include<iostream>
#include<cstdio>
#include<iomanip>
#include<algorithm>
#include<cstring>
#include<cstdlib>
#include<ctime>
#include<cmath>
#include<vector>
#include<queue>
#include<map>
#include<set>#define ll long long
#define db double
#define rg register intusing namespace std;int n,m,S,T;
int ans,top=1;
int dep[505];
int tou[505];
int qi[505];
int f[55][55];struct su{int to,v,next;
}b[5005];inline int qr(){register char ch; register bool sign=0; rg res=0;while(!isdigit(ch=getchar()))if(ch=='-')sign=1;while(isdigit(ch))res=res*10+(ch^48),ch=getchar();if(sign)return -res; else return res;
}inline void add(int x,int y,int v){ //注意博主加边自带反向b[++top]=su{y,v,tou[x]}; tou[x]=top;b[++top]=su{x,0,tou[y]}; tou[y]=top;
}inline bool bfs(int x){for(rg i=1;i<=x;++i)qi[i]=tou[i],dep[i]=0;queue<int> q; q.push(S); dep[S]=1;while(!q.empty()){rg i=q.front(); q.pop();for(rg j=tou[i];j;j=b[j].next)if(b[j].v&&!dep[b[j].to]){dep[b[j].to]=dep[i]+1;if(b[j].to==T)return 1;q.push(b[j].to);}} return 0;
}inline int dfs(int i,int w){if(i==T||!w)return w;rg rest=w,f;for(rg &j=qi[i];j;j=b[j].next){if(b[j].v&&dep[b[j].to]==dep[i]+1){f=dfs(b[j].to,min(w,b[j].v));if(!f){dep[b[j].to]=-2; continue;}b[j].v-=f; b[j^1].v+=f; w-=f;} if(!w)break;}return rest-w;
}inline void solve(){rg res=0; top=1;for(rg i=1;i<=n*2+2;++i) tou[i]=0; //初始化for(rg i=1;i<=n;++i){if(i!=S&&i!=T)add(i,i+n,1); //一点拆成两点,中间连边for(rg j=1;j<=n;++j)if(f[i][j])add(i+n,j,1e9); //连边注意是否有加n操作} S=S+n;while(bfs(n*2+2)) res+=dfs(S,1e9); //DInicans=min(res,ans);
}int main(){//freopen(".in","r",stdin);//freopen(".out","w",stdout);rg t=qr();while(t--){n=qr();m=qr();for(rg i=1;i<=n;++i){for(rg j=i;j<=n;++j){f[i][j]=f[j][i]=0; //初始化}}for(rg i=1;i<=m;++i){rg x=qr()+1,y=qr()+1;f[x][y]=f[y][x]=1; //邻接矩阵读边}if(n==0||n==2){puts("0");continue;}if(m==0&&n&&n!=2){puts("1");continue;}//特判,这题有点卡细节ans=1e9;for(rg i=1;i<=n;++i){for(rg j=1;j<=n;++j){if(f[i][j]||i==j)continue; //注意两个相邻的点不可能通过割点不联通S=i;T=j; solve(); //枚举源汇点}} if(ans==1e9)ans=n; //无论怎么割点图都联通,就输出nprintf("%d\n",ans);}return 0;
}

转载于:https://www.cnblogs.com/812-xiao-wen/p/11257791.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/263079.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

harbor安装时出现ERROR: An HTTP request took too long to complete. Retry with --verbose to obtain debug in

harbor安装时出现ERROR: An HTTP request took too long to complete. Retry with --verbose to obtain debug information.If you encounter this issue regularly because of slow network conditions, consider setting COMPOSE_HTTP_TIMEOUT to a higher value current val…

配置msdtc

配置msdtc需要分别配置数据库服务器和开发机&#xff0c;因为只有两个机器都配置正确了&#xff0c;分布式事务才不会报乌七八糟的错误。如果数据库服务器和开发机是同一台机器&#xff0c;那就不用看本文了&#xff0c;因为不存在分布式事务的问题。 数据库服务器和开发机中配…

什么是套接字?Socket基本介绍

什么是套接字&#xff1f;Socket基本介绍一、什么是套接字&#xff1f;二、套接字特性三、套接字缓冲区一、什么是套接字&#xff1f; 套接字是一种通信机制&#xff08;通信的两方的一种约定&#xff09;&#xff0c;socket屏蔽了各个协议的通信细节&#xff0c;提供了tcp/ip…

ARM-Button-Driver-硬件图

1、实物图 2、CPU接线图 3、实际硬件接图 转载于:https://www.cnblogs.com/xmphoenix/archive/2011/11/02/2233519.html

动态创建ActiveRecord条件的查询 MyQuery

在CMS中。我们经常会按一定的条件来进行搜索。如果用户没有选择这个条件的话&#xff0c;我们就不能将它放到sql中也许我们可以用自己拼装sql语句的方式很好的实现这种查询。然后再前面过滤掉一些危险的参数但是参数过滤有一个不好的地方是。会把一些信息给过滤掉了。在castle …

kubenetes中port、targetPort、nodePort、containerPort的区别与联系

kubenetes中port、targetPort、nodePort、containerPort的区别与联系首先给出一张kubenetes结构图&#xff1a;containerPort containerPort是在pod控制器中定义的、pod中的容器需要暴露的端口。Pod中容器暴露的端口 targetPort targetPort是pod上的端口&#xff0c;从port/nod…

解决Spring下无法实时访问本地静态资源

解决Spring下浏览器无法实时访问本地静态资源场景1&#xff1a;原本地文件test.json中内容为 “1”。我们通过前后端交互操作&#xff0c;修改test.json的内容为 “2”。此时前端再次读取test.json&#xff0c;会发现内容依旧为 “1”&#xff0c;即前端并不会实时同步本地静态…

android 之数据存储(IO)

android 操作文件分为两种&#xff0c; 第一种&#xff1a;直接写到手机内存中&#xff0c;手机内存有限。 第二种&#xff1a;写到手机的内存卡(SD)中&#xff0c;进行操作文件。 以下分为两种情况的读精心操作&#xff0c;一个简单的demo.在此做一个记录。 代码。 package co…

Aspose.Java实现word转pdf,添加水印等操作

Aspose.Java实现word转pdf&#xff0c;添加水印等操作一. word转pdf二. 文档插入水印Aspose是一款商用版控件&#xff0c;支持各类文档操作&#xff0c;这里主要介绍如何在Springboot项目中使用破解版。 一. word转pdf 在项目中导入aspose.word包 百度网盘下载 提取码&#x…

SQL三种连接:内连接、外连接、交叉连接

SQL三种连接&#xff1a;内连接、外连接、交叉连接一、交叉连接&#xff08;CROSS JOIN&#xff09;二、内连接&#xff08;INNER JOIN&#xff09;三、外连接&#xff08;LEFT JOIN、RIGHT JOIN、FULL JOIN&#xff09;1.左外连接2.右外连接3.完整外连接准备两张表并以PersonI…

二叉树非递归先序遍历

二叉树的递归先序遍历很简单&#xff0c;假设二叉树的结点定义如下: 1 struct BinaryTreeNode 2 { 3 int m_nValue; 4 BinaryTreeNode* m_pLeft; 5 BinaryTreeNode* m_pRight; 6 }; 递归先序遵循:根-左-右的顺序 1 void PreOrder(BinaryTreeNode* Root) 2 { 3 …

面向对象与基于对象 区别

很多人没有区分“面向对象”和“基于对象”两个不同的概念。面向对象的三大特点&#xff08;封装&#xff0c;继承&#xff0c;多态&#xff09;却一不可。通常“基于对象”是使用对象&#xff0c;但是无法利用现有的对象模板产生新的对象类型&#xff0c;继而产生新的对象&…

显示器调校与Soft Proofing ZZ

版权归原作者所有&#xff01; http://www.cgan.net/science/popular/cookie/displayregulate.htm 自从桌面出版走到计算机上&#xff0c;显示器成为印前流程中重要的设备之一。从扫描、数码摄影、相片修改、排版等工序中&#xff0c;也可找到显示器的存在。但往往很多同业却忽…

SparkContext: Error initializing SparkContext解决方法

SparkContext: Error initializing SparkContext解决方法Spark在配置高可用集群中&#xff0c;出现报错 ERROR SparkContext: Error initializing SparkContext. java.net.ConnectException: Call From hadoop102/192.168.10.102 to hadoop102:8020 failed on connection excep…

tomcat 绑定 ip 及域名,限制非法域名访问

公司WEB 采用linuxtomcat架构。经常会收到电信的警告&#xff0c;说某个IP下挂用了未备案域名&#xff0c;如果不处理就封IP。鉴于此&#xff0c;需要将tomcat的访问地址进行限制&#xff0c;只允许通过IP地址或者自己指定的域名来访问。配置tomcat/conf/server.xml 文件&#…

数据库设计(四)概念数据模型

目标&#xff1a;本文主要介绍如何定义实体的主、次标识符。一、标识符标识符是实体中一个或多个属性的集合&#xff0c;可用来唯一标识实体中的一个实例。要强调的是&#xff0c;CDM中的标识符等价于PDM中的主键或候选键。每个实体都必须至少有一个标识符。如果实体只有一个标…

中文/英文换行总结

html部分 <div class"parent"><p class"p1">湿哒哒大的大大大的大的大大大的大的啊啊大大大啊大大打啊打大大大</p><p class"p2">湿哒哒大的大大大的大的大大大的大的啊啊大大大啊大大打啊打大大大</p><p clas…

萨蒂扬软件技术(南京)研发中心”落户高新区

萨蒂扬软件技术&#xff08;南京&#xff09;研发中心”落户高新区 2007-02-12“中国软件名城”成为南京吸引世界软件巨头强磁场“萨蒂扬软件技术&#xff08;南京&#xff09;研发中心”落户高新区 世界知名的印度软件企业巨头萨帝扬计算机服务有限公司挥师江苏亮出精彩第一笔…

Go学习笔记—多线程

多线程编程 ​ 一个进程可以包含多个线程&#xff0c;这些线程运行的一定是同一个程序&#xff08;进程程序&#xff09;&#xff0c;且都由当前进程中已经存在的线程通过系统调用的方式创建出来。进程是资源分配的基本单位&#xff0c;线程是调度运行的基本单位&#xff0c;线…

对象实体 参考标准

1usingSystem;2usingSystem.Data;34namespaceFramework.Components5{ 6 /**//// <summary> 7 /// 公告通知实体 8 /// </summary> 9 public class NoticeInfo 10 { 11 基础信息-------------------------------------------------------…