题意翻译

题目大意: 给定一个n(n <= 50)个点的无向图,求它的点联通度。即最少删除多少个点,使得图不连通。

解析

网络瘤拆点最小割。

定理

最大流\(=\)最小割

感性地理解(口胡)一下:首先显然最大流\(<=\)割,而根据最大流定义,最小割恰恰就是要恰好割断最大流经过的所有最窄流量的边集,就能恰好使得源点和汇点不连通,即最大流\(=\)最小割。

至于具体的证明,我也不知道。

拆点

一般来说,正常的拆点有两个作用:

  1. 在不改变原图连通性的情况下,将点权转化为边权。
  2. 通过化点为边,限制通过某点的流量。

对于无向图和有向图,一般意义上的拆点做法是相同的。

一般做法:以有向图为例,对于原图中的一个点对\((x,y)\),且有一条有向边\(c(x,y)\)。我们将其分别拆成两个点\(x,x',y,y'\),然后\(x\rightarrow x',y\rightarrow y'\)这样连接有向边,如果原来的点有点权那么将有向边的边权赋值为点权,如果没有点权则赋值为1。对于原图存在的有向边,连接\(x'\rightarrow y\)。

对于无向边,我们再连一条边\(y'\rightarrow x\)即可。

那么对于本题,显然是一个求最少割点,我们转化为拆点最大流做。

注意可能有多组数据。

参考代码

#include<cstdio>
#include<iostream>
#include<cmath>
#include<cstring>
#include<ctime>
#include<cstdlib>
#include<algorithm>
#include<queue>
#include<set>
#include<map>
#define INF 0x3f3f3f3f
#define N 110
using namespace std;
struct node{
int next,ver,leng;
}g[N<<1];
int tot,head[N],d[N],n,m,a[N],b[N],s,t;
inline void add(int x,int y,int val)
{
g[++tot].ver=y,g[tot].leng=val;
g[tot].next=head[x],head[x]=tot;
}
inline bool bfs()
{
memset(d,0,sizeof(d));
queue<int> q;
d[s]=1;q.push(s);
while(q.size()){
int x=q.front();q.pop();
for(int i=head[x];i;i=g[i].next){
int y=g[i].ver,z=g[i].leng;
if(!z||d[y]) continue;
d[y]=d[x]+1;
if(y==t) return 1;
q.push(y);
}
}
return 0;
}
inline int dinic(int x,int flow)
{
if(x==t) return flow;
int rest=flow;
for(int i=head[x];i&&rest;i=g[i].next){
int y=g[i].ver,z=g[i].leng;
if(!z||d[y]!=d[x]+1) continue;
int k=dinic(y,min(rest,z));
if(!k) d[y]=0;
else{
g[i].leng-=k;
g[i^1].leng+=k;
rest-=k;
}
}
return flow-rest;
}
int main()
{
while(~scanf("%d%d",&n,&m)){
int ans=INF;
for(int i=0;i<m;++i){
a[i]=b[i]=0;
char str[20];
scanf("%s",str);
int j=1;
while(str[j]!=',') a[i]=a[i]*10+str[j]-'0',++j;
j++;
while(str[j]!=')') b[i]=b[i]*10+str[j]-'0',++j;
}
for(s=0;s<n;++s)
for(t=0;t<n;++t){
if(s==t) continue;
memset(head,0,sizeof(head));
tot=1;
for(int i=0;i<n;++i)
if(i==s||i==t) add(i,i+n,INF),add(i+n,i,0);
else add(i,i+n,1),add(i+n,i,0);
for(int i=0;i<m;++i){
add(a[i]+n,b[i],INF),add(b[i]+n,a[i],INF);
add(b[i],a[i]+n,0),add(b[i],a[i]+n,0);
}
int now=0,tmp=0;
while(bfs())
while((now=dinic(s,INF))) tmp+=now;
ans=min(ans,tmp);
}
if(n<=1||ans==INF) ans=n;
cout<<ans<<endl;
}
return 0;
}

UVA1660 电视网络 Cable TV Network[拆点+最小割]的更多相关文章

  1. UVA1660 电视网络 Cable TV Network

    题目地址:UVA1660 电视网络 Cable TV Network 枚举两个不直接连通的点 \(S\) 和 \(T\) ,求在剩余的 \(n-2\) 个节点中最少去掉多少个可以使 \(S\) 和 \ ...

  2. POJ 1966 Cable TV Network 【经典最小割问题】

    Description n个点的无向图,问最少删掉几个点,使得图不连通 n<=50 m也许可以到完全图? Solution 最少,割点,不连通,可以想到最小割. 发现,图不连通,必然存在两个点不 ...

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

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

  4. 【UVA1660】Cable TV Network

    题目大意:给定一个 N 个点的无向图,求至少删去多少个点可以使得无向图不连通. 题解:学习到了点边转化思想. 根据网络流的知识可知,一个网络的最小割与网络的最大流相等.不过最小割是图的边集,而本题则是 ...

  5. ZOJ 2182 Cable TV Network(无向图点割-最大流)

    题目链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=2182 题意:给出一个无向图,问最少删掉多少个顶点之后图变得不连通 ...

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

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

  7. POJ 1966 Cable TV Network

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

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

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

  9. Cable TV Network 顶点连通度 (最大流算法)

    Cable TV Network 题目抽象:给出含有n个点顶点的无向图,给出m条边.求定点联通度   K 算法:将每个顶点v拆成 v'   v''  ,v'-->v''的容量为1.       ...

随机推荐

  1. vue-cli3 中console.log报错

    Module Warning (from ./node_modules/eslint-loader/index.js):error: Unexpected console statement (no- ...

  2. iOS:Xcode代码块,提升敲代码的效率

    一.代码块在哪里? 看下图 或者 快捷键:command+shift+L 长这样: 二.如何创建代码块: 1.先选中要创建的代码片段,然后点击右键,选中 Create Code Snippet 然后会 ...

  3. ubuntu18.04安装Anaconda

    jiangshan@dell-Precision-7920-Tower:~$ lsAnaconda3-2019.07-Linux-x86_64.shjiangshan@dell-Precision-7 ...

  4. 转载:c++获取本机IP地址

    windows下获取IP地址的两种方法: 一种可以获取IPv4和IPv6,但是需要WSAStartup: 一种只能取到IPv4,但是不需要WSAStartup: 如下: 方法一:(可以获取IPv4和I ...

  5. 20 IO流(十七)——Commons工具包,FileUtils(二)——copy方法

    copy方法 package com.sxt.copy; import java.io.File; import java.io.IOException; import java.net.URL; i ...

  6. 使用PHP开发HR系统(5)

    本节讲述如何拆分页面以及使用jquery和ajax实现局部刷新. =================================================================== ...

  7. 解决pyspider框架web预览框过小问题

    解决pyspider框架web预览框过小问题 Chrome 使用pyspider框架时,web预览框只有一小条: 解决办法: 找到debug.min.css文件,替换为如下内容: body{margi ...

  8. C#中的Process类使用

    有时候,用户在进行某个操作时,程序运行到某个阶段突然崩溃,我们需要让程序自动重启,重新执行用户之前的操作,当发现主程序还存在,就重启用户执行的附加程序.这时候Process就派上了用场. 控制台测试用 ...

  9. OO——UML解析

    目录 第四单元博客作业 一.前两次作业架构设计 1. 第一次作业 2. 第二次作业 二.架构设计以及对OO方法理解的演进 1. 表达式求导 2. 多线程电梯 3. 地铁线路查询 4. UML图的解析 ...

  10. 【Linux内核】CPU和线程

    首先明确一个概念,Linux系统中甚至没有真正的线程.不过,可以认为Linux是系统的线程是内核线程,所有调度是基于线程的. 1.线程分类 一个进程由于其运行空间的不同, 从而有内核线程和用户进程的区 ...