热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

UVA1660电视网络CableTVNetwork[拆点+最小割]

题意翻译题目大意:给定一个n(n

题意翻译

题目大意&#xff1a; 给定一个n(n <&#61; 50)个点的无向图&#xff0c;求它的点联通度。即最少删除多少个点&#xff0c;使得图不连通。

解析

网络瘤拆点最小割。

定理

最大流\(&#61;\)最小割

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

至于具体的证明&#xff0c;我也不知道


拆点

一般来说&#xff0c;正常的拆点有两个作用&#xff1a;

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

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


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

对于无向边&#xff0c;我们再连一条边\(y&#39;\rightarrow x\)即可。


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

注意可能有多组数据。

参考代码

#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#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[&#43;&#43;tot].ver&#61;y,g[tot].leng&#61;val;g[tot].next&#61;head[x],head[x]&#61;tot;
}
inline bool bfs()
{memset(d,0,sizeof(d));queue q;d[s]&#61;1;q.push(s);while(q.size()){int x&#61;q.front();q.pop();for(int i&#61;head[x];i;i&#61;g[i].next){int y&#61;g[i].ver,z&#61;g[i].leng;if(!z||d[y]) continue;d[y]&#61;d[x]&#43;1;if(y&#61;&#61;t) return 1;q.push(y);}}return 0;
}
inline int dinic(int x,int flow)
{if(x&#61;&#61;t) return flow;int rest&#61;flow;for(int i&#61;head[x];i&&rest;i&#61;g[i].next){int y&#61;g[i].ver,z&#61;g[i].leng;if(!z||d[y]!&#61;d[x]&#43;1) continue;int k&#61;dinic(y,min(rest,z));if(!k) d[y]&#61;0;else{g[i].leng-&#61;k;g[i^1].leng&#43;&#61;k;rest-&#61;k;}}return flow-rest;
}
int main()
{while(~scanf("%d%d",&n,&m)){int ans&#61;INF;for(int i&#61;0;i}

转:https://www.cnblogs.com/DarkValkyrie/p/11376443.html



推荐阅读
  • 本文介绍如何从字符串中移除大写、小写、特殊、数字和非数字字符,并提供了多种编程语言的实现示例。 ... [详细]
  • 并发编程 12—— 任务取消与关闭 之 shutdownNow 的局限性
    Java并发编程实践目录并发编程01——ThreadLocal并发编程02——ConcurrentHashMap并发编程03——阻塞队列和生产者-消费者模式并发编程04——闭锁Co ... [详细]
  • 深入解析Java虚拟机(JVM)架构与原理
    本文旨在为读者提供对Java虚拟机(JVM)的全面理解,涵盖其主要组成部分、工作原理及其在不同平台上的实现。通过详细探讨JVM的结构和内部机制,帮助开发者更好地掌握Java编程的核心技术。 ... [详细]
  • 在高并发需求的C++项目中,我们最初选择了JsonCpp进行JSON解析和序列化。然而,在处理大数据量时,JsonCpp频繁抛出异常,尤其是在多线程环境下问题更为突出。通过分析发现,旧版本的JsonCpp存在多线程安全性和性能瓶颈。经过评估,我们最终选择了RapidJSON作为替代方案,并实现了显著的性能提升。 ... [详细]
  • CSS高级技巧:动态高亮当前页面导航
    本文介绍了如何使用CSS实现网站导航栏中当前页面的高亮显示,提升用户体验。通过为每个页面的body元素添加特定ID,并结合导航项的类名,可以轻松实现这一功能。 ... [详细]
  • 深入解析Spring启动过程
    本文详细介绍了Spring框架的启动流程,帮助开发者理解其内部机制。通过具体示例和代码片段,解释了Bean定义、工厂类、读取器以及条件评估等关键概念,使读者能够更全面地掌握Spring的初始化过程。 ... [详细]
  • 在尝试使用C# Windows Forms客户端通过SignalR连接到ASP.NET服务器时,遇到了内部服务器错误(500)。本文将详细探讨问题的原因及解决方案。 ... [详细]
  • 深入解析动态代理模式:23种设计模式之三
    在设计模式中,动态代理模式是应用最为广泛的一种代理模式。它允许我们在运行时动态创建代理对象,并在调用方法时进行增强处理。本文将详细介绍动态代理的实现机制及其应用场景。 ... [详细]
  • 由二叉树到贪心算法
    二叉树很重要树是数据结构中的重中之重,尤其以各类二叉树为学习的难点。单就面试而言,在 ... [详细]
  • 本文介绍了如何使用暴力方法解决HDU5444问题。代码通过逐个检查输入数据,确保在所有情况下都能找到正确的解决方案。 ... [详细]
  • 二叉树的链表实现
    本文介绍了一种使用链表结构表示二叉树的方法。通过定义节点结构和相关操作函数,可以方便地创建、插入和遍历二叉树。 ... [详细]
  • 本文介绍了一种基于选择排序思想的高效排序方法——堆排序。通过使用堆数据结构,堆排序能够在每次查找最大元素时显著提高效率。文章详细描述了堆排序的工作原理,并提供了完整的C语言代码实现。 ... [详细]
  • Linux环境下进程间通信:深入解析信号机制
    本文详细探讨了Linux系统中信号的生命周期,从信号生成到处理函数执行完毕的全过程,并介绍了信号编程中的注意事项和常见应用实例。通过分析信号在进程中的注册、注销及处理过程,帮助读者理解如何高效利用信号进行进程间通信。 ... [详细]
  • 本文探讨了在 SQL Server 中使用 JDBC 插入数据时遇到的问题。通过详细分析代码和数据库配置,提供了解决方案并解释了潜在的原因。 ... [详细]
  • 本文介绍了如何通过Java代码计算一个整数的位数,并展示了多个基础编程示例,包括求和、平均分计算、条件判断等。 ... [详细]
author-avatar
中国地产人
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有