POJ 1966 Cable TV Network (点连通度)【最小割】
<题目链接>
题目大意:
给定一个无向图,求点连通度,即最少去掉多少个点使得图不连通。
解题分析:
解决点连通度和边连通度的一类方法总结见 >>>
本题是求点连通度,所以对每个点进行拆点,然后入点向出点连一条容量为1的边,其它边则是用一个容量为INF的边来代替。然后就是枚举一下源点和汇点,跑最大流,选最小的值即可。不过,本题需要注意一下是否为完全图,因为完全图的最大流是INF,所以特判一下,如果是完全图,就将点全部删除,输出n。
#include <cstdio>
#include <iostream>
#include <algorithm>
#include <vector>
#include <queue>
#include <cstring>
using namespace std; typedef long long ll;
const int N = , INF = 0x3f3f3f3f; struct Dinic
{
struct edge{ int from,to;ll cap,flow; }; //cap-flow才是这条边的真实流量
vector<edge>es;
vector<int>G[N];
bool vis[N];
int dist[N],iter[N];
void init(int n){
for(int i=; i<=n+; i++)G[i].clear();
es.clear();
}
void addedge(int from,int to,ll cap){
es.push_back((edge){from,to,cap,}); //将边存储的边表
es.push_back((edge){to,from,,});
int x=es.size();
G[from].push_back(x-); //G[u][i]记录以u为顶点的第i条边的反边在es中的编号
G[to].push_back(x-);
}
bool BFS(int s,int t){ //bfs将该图划分成分层图
memset(vis,,sizeof(vis));
queue <int> q;
vis[s]=;
dist[s]=;
q.push(s);
while(!q.empty()){
int u=q.front();q.pop();
for(int i=; i<G[u].size(); i++){
edge &e=es[G[u][i]];
if(!vis[e.to]&&e.cap>e.flow){
vis[e.to]=;
dist[e.to]=dist[u]+;
q.push(e.to);
}
}
}
return vis[t];
}
int DFS(int u,int t,ll f){
if(u==t||f==)return f;
int nowflow=,d;
for(int &i=iter[u]; i<G[u].size(); i++){
edge &e=es[G[u][i]];
if(dist[u]+==dist[e.to]&&(d=DFS(e.to,t,min(f,e.cap-e.flow)))>){
e.flow+=d; //正边真实流量-d
es[G[u][i]^].flow-=d; //反边真实流量+d
nowflow+=d; //得到现在搜得的能够流入汇点的流量
f-=d; //找到一条增广路之后,减去这条路的流量,然后继续从这个顶点的其它边开始寻找增广路
if(f==)break;
}
}
return nowflow;
}
int Maxflow(int s,int t){
int flow=;
while(BFS(s,t)){
memset(iter,,sizeof(iter));
int d=;
while(d=DFS(s,t,INF))flow+=d;
}
return flow;
}
}dinic; int mpa[][];
int n,m; inline void getGraph(){
dinic.init(*n+);
for(int i=;i<n;i++){
for(int j=;j<n;j++){
if(i==j)dinic.addedge(i,i+n,);
else if(mpa[i][j])dinic.addedge(i+n,j,INF);
}
}
} int main(){
while(cin>>n>>m){
memset(mpa,,sizeof(mpa));
for(int i=;i<=m;i++){
int u,v;scanf(" (%d,%d)",&u,&v);
mpa[u][v]=mpa[v][u]=;
}
int ans=INF;
for(int st=;st<n;st++){
for(int ed=st+;ed<n;ed++){
getGraph();
ans=min(ans,dinic.Maxflow(st+n,ed)); //注意这里是st+n
}
}
if(ans>n)ans=n; //如果是完全图,最大流就是INF,只能全部删除,才能使得原图不连通
printf("%d\n",ans);
}
}
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 Submissi ...
- POJ 1966 Cable TV Network
Cable TV Network Time Limit: 1000MS Memory Limit: 30000K Total Submissions: 4702 Accepted: 2173 ...
- POJ 1966 Cable TV Network 【经典最小割问题】
Description n个点的无向图,问最少删掉几个点,使得图不连通 n<=50 m也许可以到完全图? Solution 最少,割点,不连通,可以想到最小割. 发现,图不连通,必然存在两个点不 ...
- UVA-1660 Cable TV Network (最小割)
题目大意:给一张n个点.m条边的无向图,求最小点割集的基数. 题目分析:求无向图最小点割集的基数可以变成求最小割.考虑单源s单汇t的无向图,如果要求一个最小点集,使得去掉这个点集后图不再连通(连通分量 ...
- POJ 1966 Cable TV Network (无向图点连通度)
[题意]给出一个由n个点,m条边组成的无向图.求最少去掉多少点才能使得图中存在两点,它们之间不连通. [思路]回想一下s->t的最小点割,就是去掉多少个点能使得s.t不连通.那么求点连通度就枚举 ...
- POJ - 1966 Cable TV Network (最大流求点连通度)
题意:求一个无向图的点连通度.点联通度是指,一张图最少删掉几个点使该图不连通:若本身是非连通图,则点连通度为0. 分析:无向图的点连通度可以转化为最大流解决.方法是:1.任意选择一个点作为源点:2.枚 ...
- poj 1966 Cable TV Network 顶点连通度
题目链接 给一个图, n个点m条边, 求至少去掉多少个点可以使得图不再联通.随便指定一个点为源点, 枚举其他点为汇点的情况, 跑网络流, 求其中最小的情况. 如果最后ans为inf, 说明是一个完全图 ...
随机推荐
- 微信小程序 TLS 版本必须大于等于1.2问题解决
微信小程序 TLS 版本必须大于等于1.2问题解决 此问题最近在微信小程序开发中,比较常见. 在解决这个问题之前,我们需要了解一下,当前的系统环境是否支持TLS1.2以上,可以参考一下表格: 确认系 ...
- 2018-2019-2 《Java程序设计》第8周学习总结
20175319 2018-2019-2 <Java程序设计>第8周学习总结 教材学习内容总结 本周学习<Java程序设计>第十五章: 泛型: 泛型(Generics)的主要目 ...
- ./runInstaller: Permission denied
一:问题描述 安装oracle过程中出现 二:解决 /usr/local/Oracle11./database/runInstaller /usr/local/Oracle11./database/i ...
- Git安装与仓库搭建
yum install git-all cd /srv git init --bare net_server.git git remote - v git remote add server root ...
- CRMEB 商城系统常见错误修复办法
清空了用户表,没有清空拼团记录表导致,解决办法 --v2.5.2 清空拼团表-- TRUNCATE table eb_store_pink 修改了组合数据规则导致的,更新数据即可 --v2.5.2 e ...
- vue 点击展开显示更多 点击收起部分隐藏
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- Keep面经汇总
目录 一.Java 线程如何终止 如何用一个cancel方法停止两个线程 泛型原理.使用场景.优缺点 手写代码,设计parseInt hashmap是怎么实现的,是线程安全的吗 知道hashmap的扩 ...
- GDAL create kml
新增kml 点 public void WriteKmlPiont() { string driverName = "KML"; //MapInfo File OSGeo.GDAL ...
- Tree Cutting POJ - 2378 (树形DP)
题目链接:POJ - 2378 题目大意:给你n个点,然后问你这n个点中 ,去除哪些点能够使得剩下的图中最大的连通块中点的个数不超过n/2. 具体思路:第一遍dfs记录每一个点代表的子树大小,第二遍d ...
- MSSQL的简单盲注
方式一:遍历ascii码的方式 一.判断数据库类型 and (select count(*) from sysobjects)>0 二.获取数据库 and ascii(substring((se ...