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 【经典最小割问题】的更多相关文章

  1. POJ 1966 Cable TV NETWORK(网络流-最小点割集)

                                    Cable TV NETWORK The interconnection of the relays in a cable TV net ...

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

    $ POJ~1966~Cable~TV~Network $ $ solution: $ 第一眼可能让人很难下手,但本就是冲着网络流来的,所以我们直接一点.这道题我们要让这个联通图断开,那么势必会有两个 ...

  3. POJ 1966 Cable TV Network

    Cable TV Network Time Limit: 1000MS   Memory Limit: 30000K Total Submissions: 4702   Accepted: 2173 ...

  4. POJ 1966 Cable TV Network(顶点连通度的求解)

                               Cable TV Network Time Limit: 1000MS   Memory Limit: 30000K Total Submissi ...

  5. UVA-1660 Cable TV Network (最小割)

    题目大意:给一张n个点.m条边的无向图,求最小点割集的基数. 题目分析:求无向图最小点割集的基数可以变成求最小割.考虑单源s单汇t的无向图,如果要求一个最小点集,使得去掉这个点集后图不再连通(连通分量 ...

  6. POJ 1966 Cable TV Network (点连通度)【最小割】

    <题目链接> 题目大意: 给定一个无向图,求点连通度,即最少去掉多少个点使得图不连通. 解题分析: 解决点连通度和边连通度的一类方法总结见   >>> 本题是求点连通度, ...

  7. POJ 1966 Cable TV Network (无向图点连通度)

    [题意]给出一个由n个点,m条边组成的无向图.求最少去掉多少点才能使得图中存在两点,它们之间不连通. [思路]回想一下s->t的最小点割,就是去掉多少个点能使得s.t不连通.那么求点连通度就枚举 ...

  8. poj 1966 Cable TV Network 顶点连通度

    题目链接 给一个图, n个点m条边, 求至少去掉多少个点可以使得图不再联通.随便指定一个点为源点, 枚举其他点为汇点的情况, 跑网络流, 求其中最小的情况. 如果最后ans为inf, 说明是一个完全图 ...

  9. POJ 1966 Cable TV Network (算竞进阶习题)

    拆点+网络流 拆点建图应该是很常见的套路了..一张无向图不联通,那么肯定有两个点不联通,但是我们不知道这两个点是什么. 所以我们枚举所有点,并把每个点拆成入点和出点,每次把枚举的两个点的入点作为s和t ...

随机推荐

  1. 最新!2016中国城市GDP排名出炉

    2017年1月20日,国家统计局公布:2016年中国国内生产总值GDP达744127亿元,同比增长6.7%,城市GDP方面:截至1月20日,全国大部分城市的去年经济运行数据已经公布,根据信息汇总,20 ...

  2. python常用模块目录

    博客目录总纲首页 python其他知识目录 random  hashlib  os  sys  json __name__ shutil  xlrd  xlwt   xlutils 核心模块:os s ...

  3. MySQL课堂练习 20162315

    练习内容 1.参考教材相关代码,提交能连接到world的截图(有学号水印) 2.查询world数据库,获得人口超过500万的所有城市的列表. 3.查询world数据库,获得New Jersey州所有城 ...

  4. Sprint计划表

    Sprint会议计划 一.Sprint  需求 准备环节:小组成员利用周六周日在网上查阅Android开发的教程,练习开发一些简单的小程序,具备一定的开发能力,在电脑上搭建Android开发环境,做好 ...

  5. 团队项目--NABCD模型

    蹭课神器 N(need需求) 每个人的兴趣都不一样,或许你很喜欢自己的专业,并且想再进一步学习专业知识:或许你不是太喜欢自己的专业,想上一些自己感兴趣的课程:但是,当你想上你所钟 意的课时,却发现自己 ...

  6. 第一次spring冲刺第6天

    鉴于昨天的调查,今天做了个谈论,主要针对以下几个问题 1.我们的客户类型? 2.如何实现他们的需求? 3.他们真正想要什么? 4.如何保证他们的满足度? 5.怎么使得工程不陷入死循环? 6.还存在什么 ...

  7. (小组)第六次作业:NABCD模型分析。产品Backlog。

    NABCD模型分析: NABCD模型分析 1.N——need需求 随着时代的进步,人们生活水平的提高,现在手机的普及率已经非常高了,而且现在的家长很多时候会忙于工作,很少会花时间出来给自己读小学的孩子 ...

  8. Java编写的电梯模拟系统《结对作业》

    作业代码:https://coding.net/u/liyi175/p/Dianti/git 伙伴成员:李伊 http://home.cnblogs.com/u/Yililove/ 对于这次作业,我刚 ...

  9. angularJS1笔记-(11)-自定义指令(transclude/priority/terminal)

    自定义指令的属性 transclude:为true时,允许把html中新定义的指令中原来的dom运用到该指令的template中. 属性priority,设置该指令的优先级,优先级大的先执行,默认指令 ...

  10. debug阶段团队贡献分分配

    小组名称:飞天小女警 项目名称:礼物挑选小工具 小组成员:沈柏杉(组长).程媛媛.杨钰宁.谭力铭 debug阶段各组员的贡献分分配如下: 姓名 团队贡献分 程媛媛 5.8 沈柏杉 6.5 谭力铭 3. ...