POJ 1966 Cable TV Network 【经典最小割问题】
Description
n个点的无向图,问最少删掉几个点,使得图不连通
n<=50 m也许可以到完全图?
Solution
最少,割点,不连通,可以想到最小割。
发现,图不连通,必然存在两个点不连通。
枚举源点汇点,要让源点汇点不连通。源点汇点不能割掉
网络建图:
为了割的是边,所以要点转化成边。
对于每个x,建立x'=x+n,对于不是S、T的点(因为S、T不能割掉),x向x’连一条边权为1的边
对于原图的边e(x,y) x’->y 连接inf的边,y'->x连接inf的边。
边权保证割的是点,不是边。
x'->y连边保证,想走这条边,必须经过x。
源点汇点不唯一,所以要n^2枚举。
但是要保证S,T不直接相连,否则不可能分开。
(如果钦定0是源点,枚举汇点的话,可以hack掉
假设最优解必须割掉0,那么就ans大了
但是数据水)
然后每次重新建图。
跑dinic最小割,所有的最小割取min即可。
题目一些小坑:
1.图不连通?没关系,可以枚举得到最小割为0
2.m=0,同上
3.如果完全图?没有S、T满足不直接相邻,那么一定就是n
fl记录一下有没有dinic过即可。
4.n=1?同上fl可以判断。
我犯得错误:还是没有注意到点数拆点后是2*n的事实,开始hd[50]开小了,改成hd[100]才行的。
图中的实际点,和创造的虚拟点的数量要弄清楚。(话说不是RE而是WA?)
Code
#include<cstdio>
#include<iostream>
#include<cstdlib>
#include<algorithm>
#include<cstring>
#include<queue>
#define numb ch-'0'
using namespace std;
const int N=;
const int inf=0x3f3f3f3f;
int n,m;
char ch;
void rd(int &x){
x=;
while(!isdigit(ch=getchar()));
for(x=numb;isdigit(ch=getchar());x=x*+numb);
}
struct node{
int nxt,to;
int w;
}e[*N*N+N];
int hd[*N],cnt=;
bool con[N][N];
void add(int x,int y,int z){
e[++cnt].nxt=hd[x];
e[cnt].to=y;
e[cnt].w=z;
hd[x]=cnt;
} queue<int>q;
int d[*N];
int s,t; void pre(){
memset(hd,,sizeof hd);
cnt=;
for(int i=;i<=n;i++){
for(int j=;j<=n;j++){
if(j==i) continue;
if(con[i][j]){ add(i+n,j,inf/);
add(j,i+n,);
}
}
if(i!=s&&i!=t) add(i,i+n,),add(i+n,i,);
}
}
bool bfs(){
while(!q.empty())q.pop();
memset(d,,sizeof d);
d[s+n]=;
q.push(s+n);
while(!q.empty()){
int x=q.front();q.pop();
for(int i=hd[x];i;i=e[i].nxt){
int y=e[i].to;
if(!d[y]&&e[i].w){
d[y]=d[x]+;
q.push(y);
if(y==t) return ;
}
}
}
return ;
}
int lp=;
int dfs(int x,int flow){
if(x==t) return flow;
int rest=flow;
for(int i=hd[x];i&&rest;i=e[i].nxt){
int y=e[i].to;
if(d[y]==d[x]+&&e[i].w){
int k=dfs(y,min(rest,e[i].w));
if(!k) d[y]=;
rest-=k;
e[i].w-=k;
e[i^].w+=k;
}
}
return flow-rest;
}
int wrk(){
pre();
int ret=;
int flow;
while(bfs()){
while(flow=dfs(s+n,inf)) ret+=flow;
}
return ret;
}
int ans;
bool fl;
void clear(){
memset(hd,,sizeof hd);
cnt=;
memset(con,,sizeof con);
ans=inf;
fl=false;
}
int main()
{
int x,y;
while(scanf("%d",&n)!=EOF){
clear();
scanf("%d",&m);
for(int i=;i<=m;i++){
rd(x);rd(y);
x++;y++;
con[x][y]=con[y][x]=;
}
for(int i=;i<=n;i++){
for(int j=i+;j<=n;j++){
if(con[i][j]) continue;
fl=true;
s=i,t=j;
int tmp=wrk();
ans=min(ans,tmp);
}
}
if(!fl) ans=n;
printf("%d\n",ans);
}
return ;
}
这个题,体现了“点边转化”,“容量inf”的处理思想。
点边转化:把点的信息转移到边上,或者边信息转移到点上。
点变成边:拆点,两个点之间的边信息是点的信息。并且要保证,实际经过这个点,必须经过这个边。
一般从上面的点x'向下面y连边。
边变成点:把边拆成两个,中间加一个点,记录边的信息。
POJ 1966 Cable TV Network 【经典最小割问题】的更多相关文章
- POJ 1966 Cable TV NETWORK(网络流-最小点割集)
Cable TV NETWORK The interconnection of the relays in a cable TV net ...
- POJ 1966 Cable TV Network (最大流最小割)
$ POJ~1966~Cable~TV~Network $ $ solution: $ 第一眼可能让人很难下手,但本就是冲着网络流来的,所以我们直接一点.这道题我们要让这个联通图断开,那么势必会有两个 ...
- 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 ...
- UVA-1660 Cable TV Network (最小割)
题目大意:给一张n个点.m条边的无向图,求最小点割集的基数. 题目分析:求无向图最小点割集的基数可以变成求最小割.考虑单源s单汇t的无向图,如果要求一个最小点集,使得去掉这个点集后图不再连通(连通分量 ...
- POJ 1966 Cable TV Network (点连通度)【最小割】
<题目链接> 题目大意: 给定一个无向图,求点连通度,即最少去掉多少个点使得图不连通. 解题分析: 解决点连通度和边连通度的一类方法总结见 >>> 本题是求点连通度, ...
- POJ 1966 Cable TV Network (无向图点连通度)
[题意]给出一个由n个点,m条边组成的无向图.求最少去掉多少点才能使得图中存在两点,它们之间不连通. [思路]回想一下s->t的最小点割,就是去掉多少个点能使得s.t不连通.那么求点连通度就枚举 ...
- poj 1966 Cable TV Network 顶点连通度
题目链接 给一个图, n个点m条边, 求至少去掉多少个点可以使得图不再联通.随便指定一个点为源点, 枚举其他点为汇点的情况, 跑网络流, 求其中最小的情况. 如果最后ans为inf, 说明是一个完全图 ...
- POJ 1966 Cable TV Network (算竞进阶习题)
拆点+网络流 拆点建图应该是很常见的套路了..一张无向图不联通,那么肯定有两个点不联通,但是我们不知道这两个点是什么. 所以我们枚举所有点,并把每个点拆成入点和出点,每次把枚举的两个点的入点作为s和t ...
随机推荐
- [文章存档]如何检测 Azure Web 应用沙盒环境文件系统存储量
链接:https://docs.azure.cn/zh-cn/articles/azure-operations-guide/app-service-web/aog-app-service-web-h ...
- Ubuntu系统无法识别Logitech M590蓝牙鼠标的问题
参见 - https://blog.csdn.net/yh2869/article/details/73119018 亲测可用. 系统:ubuntu 16.04 64bit 现象:鼠标配对可以成功,但 ...
- bootstrap轮播图不能显示左右箭头
引入font文件夹即可 原文 :http://www.imooc.com/qadetail/64277
- [buaa-SE-2017]个人作业-Week1
个人作业-Week1 Part1:教材中不懂的问题 1.根据书中"除了前20的学校之外,计科和软工没有区别"所以计算机科学这个专业也许在我们学校是和软件工程有区别的,但是可以料想的 ...
- java 转载
这几天忙于其他的事情,编程的习惯没有继续下去,偶然间看到了这篇文章,感觉收益颇丰,言归正传,下面即入主题 java基础知识小总结 在一个独立的原始程序里,只能有一个 public 类,却可以有许多 n ...
- 《Spring1之第五次站立会议》
<第五次站立会议> 昨天:试着做了一下主框架里的在线人数的显示代码: 今天:向小伙伴们请教了我代码的错误的解决方法以及对TCP/IP协议进行了相关的了解. 遇到的问题:虽然基本原理不难理解 ...
- 《大象Think in UML》阅读笔记之二
Think in UML阅读笔记(二) 上一次读到面向对象和面向过程的区别和各自的优势,结合实例分析了面向过程在面对大数据的时候,已经不足以满足人们的需求,所以引入了面向对象,面向对象的方法把世界看做 ...
- Structs2笔记①--structs的背景、structs2框架的意义、第一个helloworld
Struts2的背景 由出色稳定的框架struts1和webwork框架整合而来的 吸取了两大框架的优点 提高了开发的效率和规范性 更好的实现了MVC架构 解除了与servlet的强耦合性 使用str ...
- Alpha版本冲刺(四)
目录 组员情况 组员1(组长):胡绪佩 组员2:胡青元 组员3:庄卉 组员4:家灿 组员5:凯琳 组员6:丹丹 组员7:何家伟 组员8:政演 组员9:鸿杰 组员10:刘一好 组员:何宇恒 展示组内最新 ...
- 0506Scrum项目1.0
1.确定选题. 应用NABCD模型,分析你们初步选定的项目,充分说明你们选题的理由. 录制为演说视频,上传到视频网站,并把链接发到团队博客上. 截止日期:2016.5.6日晚10点 团队名称:虫洞 团 ...