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

$ solution: $
第一眼可能让人很难下手,但本就是冲着网络流来的,所以我们直接一点。这道题我们要让这个联通图断开,那么势必会有两个点变得不连通,这道题的数据范围很小,所以我们试着暴力枚举两个点。这样就变成了最小割。不过,嗯?割的东西怎么是点?
为了靠近我们已经学得知识,我们想办法看,能不能割点变成割边。反正网络流最喜欢千变万化、左右建模了。。。于是我们引进书上的一个东西:
- 一个节点可以拆成两个节点,将原节点用中间那条边表示
- 一条边可以拆成两条边,将原边用中间那个点表示
- 中间的边权为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 int
using 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); //DInic
ans=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; //无论怎么割点图都联通,就输出n
printf("%d\n",ans);
}
return 0;
}
POJ 1966 Cable TV Network (最大流最小割)的更多相关文章
- POJ 1966 Cable TV Network
Cable TV Network Time Limit: 1000MS Memory Limit: 30000K Total Submissions: 4702 Accepted: 2173 ...
- POJ 1966 Cable TV Network(顶点连通度的求解)
Cable TV Network Time Limit: 1000MS Memory Limit: 30000K Total Submissi ...
- POJ 1966 Cable TV NETWORK(网络流-最小点割集)
Cable TV NETWORK The interconnection of the relays in a cable TV net ...
- POJ 1966 Cable TV Network 【经典最小割问题】
Description n个点的无向图,问最少删掉几个点,使得图不连通 n<=50 m也许可以到完全图? Solution 最少,割点,不连通,可以想到最小割. 发现,图不连通,必然存在两个点不 ...
- POJ 1966 Cable TV Network (点连通度)【最小割】
<题目链接> 题目大意: 给定一个无向图,求点连通度,即最少去掉多少个点使得图不连通. 解题分析: 解决点连通度和边连通度的一类方法总结见 >>> 本题是求点连通度, ...
- POJ 1966 Cable TV Network (无向图点连通度)
[题意]给出一个由n个点,m条边组成的无向图.求最少去掉多少点才能使得图中存在两点,它们之间不连通. [思路]回想一下s->t的最小点割,就是去掉多少个点能使得s.t不连通.那么求点连通度就枚举 ...
- POJ 1966 Cable TV Network (算竞进阶习题)
拆点+网络流 拆点建图应该是很常见的套路了..一张无向图不联通,那么肯定有两个点不联通,但是我们不知道这两个点是什么. 所以我们枚举所有点,并把每个点拆成入点和出点,每次把枚举的两个点的入点作为s和t ...
- poj 1966 Cable TV Network 顶点连通度
题目链接 给一个图, n个点m条边, 求至少去掉多少个点可以使得图不再联通.随便指定一个点为源点, 枚举其他点为汇点的情况, 跑网络流, 求其中最小的情况. 如果最后ans为inf, 说明是一个完全图 ...
- POJ - 1966 Cable TV Network (最大流求点连通度)
题意:求一个无向图的点连通度.点联通度是指,一张图最少删掉几个点使该图不连通:若本身是非连通图,则点连通度为0. 分析:无向图的点连通度可以转化为最大流解决.方法是:1.任意选择一个点作为源点:2.枚 ...
随机推荐
- webpack安装大于4.x版本(没有配置webpack.config.js)
webpack安装大于4.x版本(没有配置webpack.config.js) webpack 输出参数-o 高版本 如果安装的webpack版本大于4+,还需要安装webpack-cli.在没有配 ...
- ef和ashx的简单测试
在这里.小弟我默默的计算了一下用一般处理程序和MVC配合EF,到底哪个快,事实问题是我感觉都差不多,因为用的是EF,所以要提高访问速率,我觉得还是要从数据访问做起: 一般处理程序代码: private ...
- 如何使用Jetbrains Clion 在一个工程里 编译单个C++源文件 (实现一键编译且运行)
这篇文章主要在下面这篇文章的基础上,先是实现了一键编译和一键运行两个单个功能,最后又进一步使用Clion自带的Custom Build Application实现编译且运行一键实现. https:// ...
- EncodeError: 'latin-1' codec can't encode characters in position 69-70: ordinal not in range(256)
UnicodeEncodeError: 'latin-1' codec can't encode characters in position 69-70: ordinal not in range( ...
- 系统分析与设计HW4
个人作业 用例建模 a. 阅读 Asg_RH 文档,绘制用例图. b. 选择你熟悉的定旅馆在线服务系统(或移动 APP),如绘制用例图.并满足以下要求: 对比 Asg_RH 用例图,请用色彩标注出创新 ...
- tensorflow学习之tf.truncated_normal和tf.random_noraml的区别
tf版本1.13.1,CPU 最近在tf里新学了一个函数,一查发现和tf.random_normal差不多,于是记录一下.. 1.首先是tf.truncated_normal函数 tf.truncat ...
- Windows.etc\hosts文件
ZC:就是将 后面的项 重定位到 前面的项 1.目录:"C:\Windows\System32\drivers\etc" 文件:"C:\Windows\System32\ ...
- java基础/数据加解密(Mooc)
一.消息摘要算法 常用摘要算法: 以下 (HEX)内容:bc指Bouncy Castle | cc指:Apache commons Codec 1.消息摘要算法MD5及MD族(MD2,MD4) 消 ...
- redis配置主从出现DENIED Redis is running in protected mode
修改redis配置文件,将绑定的ip给注释掉 #127.0.0.1 在配置文件中将protected-mode 改为no protected-mode no 另一种方式是在配置文件中设置密码 requ ...
- Github 上 Star 最多的个人 Spring Boot 开源学习项目(三)
网上连载了 Spring Boot 系列文章 这个开源项目就是 spring-boot-examples ,这是一个专注帮助初学者学习 Spring Boot 的开源项目,里面分享了各种场景下 Spr ...