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

BZOJ1934[Shoi2007]善意投票问题的最小割解决方案

在幼儿园中,有\(n\)个小朋友需要通过投票来决定是否午睡。尽管这个问题对每个孩子来说并不是特别重要,但他们仍然希望通过谦让的方式达成一致。每个人都有自己的偏好,但为了集体和谐,他们决定采用一种最小割的方法来解决这一问题。这种方法不仅能够确保每个人的意愿得到尽可能多的尊重,还能找到一个最优的解决方案,使整体满意度最大化。

题目

幼儿园里有n个小朋友打算通过投票来决定睡不睡午觉。对他们来说,这个问题并不是很重要,于是他们决定发扬谦让精神。虽然每个人都有自己的主见,但是为了照顾一下自己朋友的想法,他们也可以投和自己本来意愿相反的票。我们定义一次投票的冲突数为好朋友之间发生冲突的总数加上和所有和自己本来意愿发生冲突的人数。 我们的问题就是,每位小朋友应该怎样投票,才能使冲突数最小?

输入格式

第一行只有两个整数n,m,保证有2≤n≤300,1≤m≤n(n-1)/2。其中n代表总人数,m代表好朋友的对数。文件第二行有n个整数,第i个整数代表第i个小朋友的意愿,当它为1时表示同意睡觉,当它为0时表示反对睡觉。接下来文件还有m行,每行有两个整数i,j。表示i,j是一对好朋友,我们保证任何两对i,j不会重复。

输出格式

只需要输出一个整数,即可能的最小冲突数。

输入样例

3 3

1 0 0

1 2

1 3

3 2

输出样例

1

解释

在第一个例子中,所有小朋友都投赞成票就能得到最优解

题解

我们设源汇点S、T,S向赞成的小朋友连边,不赞成的向T连边,好友之间互相连边,容量均为1
此时求最小割即为答案
对于任意一一对好友,他们要么在同一边,要么二者断开【好友冲突】,要么其中一者与源汇点断开【改变意愿】

#include
#include
#include
#include
#include
#define LL long long int
#define REP(i,n) for (int i &#61; 1; i <&#61; (n); i&#43;&#43;)
#define Redge(u) for (int k &#61; h[u]; k !&#61; -1; k &#61; ed[k].nxt)
using namespace std;
const int maxn &#61; 305,maxm &#61; 300005,INF &#61; 1000000000;
inline int RD(){int out &#61; 0,flag &#61; 1; char c &#61; getchar();while (c <48 || c > 57) {if (c &#61;&#61; &#39;-&#39;) flag &#61; -1; c &#61; getchar();}while (c >&#61; 48 && c <&#61; 57) {out &#61; (out <<1) &#43; (out <<3) &#43; c - &#39;0&#39;; c &#61; getchar();}return out * flag;
}
int h[maxn],ne &#61; 0,N,M,d[maxn],vis[maxn],cur[maxn],S,T;
struct EDGE{int to,nxt,f;}ed[maxm];
inline void build(int u,int v,int w){ed[ne] &#61; (EDGE){v,h[u],w}; h[u] &#61; ne&#43;&#43;;ed[ne] &#61; (EDGE){u,h[v],0}; h[v] &#61; ne&#43;&#43;;
}
bool bfs(){queue<int> q;for (int i &#61; S; i <&#61; T; i&#43;&#43;) vis[i] &#61; false,d[i] &#61; INF;d[S] &#61; 0; q.push(S); int to,u;while (!q.empty()){u &#61; q.front(); q.pop();Redge(u) if (ed[k].f && !vis[to &#61; ed[k].to]){d[to] &#61; d[u] &#43; 1; vis[to] &#61; true;q.push(to);}}return vis[T];
}
int dfs(int u,int minf){if (u &#61;&#61; T || !minf) return minf;int flow &#61; 0,f,to;if (cur[u] &#61;&#61; -2) cur[u] &#61; h[u];for (int& k &#61; cur[u]; k !&#61; -1; k &#61; ed[k].nxt)if (d[to &#61; ed[k].to] &#61;&#61; d[u] &#43; 1 && (f &#61; dfs(to,min(minf,ed[k].f)))){ed[k].f -&#61; f; ed[k ^ 1].f &#43;&#61; f;flow &#43;&#61; f; minf -&#61; f;if (!minf) break;}return flow;
}
int maxflow(){int flow &#61; 0;while (bfs()){fill(cur,cur &#43; maxn,-2);flow &#43;&#61; dfs(S,INF);}return flow;
}
int main(){memset(h,-1,sizeof(h));N &#61; RD(); M &#61; RD(); S &#61; 0; T &#61; N &#43; 1; int a,b;REP(i,N) if (RD()) build(S,i,1); else build(i,T,1);while (M--){a &#61; RD(); b &#61; RD();build(a,b,1); build(b,a,1);}printf("%d",maxflow());return 0;
}


转:https://www.cnblogs.com/Mychael/p/8282746.html



推荐阅读
  • Codeforces 1065D 解题心得与代码实现分析 ... [详细]
  • 题目描述:小K不幸被LL邪教洗脑,洗脑程度之深使他决定彻底脱离这个邪教。在最终离开前,他计划再进行一次亚瑟王游戏。作为最后一战,他希望这次游戏能够尽善尽美。众所周知,亚瑟王游戏的结果很大程度上取决于运气,但通过合理的策略和算法优化,可以提高获胜的概率。本文将详细解析洛谷P3239 [HNOI2015] 亚瑟王问题,并提供具体的算法实现方法,帮助读者更好地理解和应用相关技术。 ... [详细]
  • 掌握DSP必备的56个核心问题,我已经将其收藏以备不时之需! ... [详细]
  • 题目《UVa 11978 福岛核爆问题》涉及圆与多边形交集面积的计算及二分法的应用。该问题的核心在于通过精确的几何运算与高效的算法实现来解决复杂图形的面积计算。在实现过程中,特别需要注意的是对多边形顶点的平移处理,确保所有顶点包括最后一个顶点 \( p[n] \) 都经过正确的位移,以避免因细节疏忽导致的错误。此外,使用循环次数为50次的二分法能够有效提高算法的精度和稳定性。 ... [详细]
  • POJ 1696: 空间蚂蚁算法优化与分析
    针对 POJ 1696 的空间蚂蚁算法进行了深入的优化与分析。本研究通过改进算法的时间复杂度和空间复杂度,显著提升了算法的效率。实验结果表明,优化后的算法在处理大规模数据时表现优异,能够有效减少计算时间和内存消耗。此外,我们还对算法的收敛性和稳定性进行了详细探讨,为实际应用提供了可靠的理论支持。 ... [详细]
  • 题目旨在解决树上的路径最优化问题,具体为在给定的树中寻找一条长度介于L到R之间的路径,使该路径上的边权平均值最大化。通过点分治策略,可以有效地处理此类问题。若无长度限制,可采用01分数规划模型,将所有边权减去一个常数m,从而简化计算过程。此外,利用单调队列优化动态规划过程,进一步提高算法效率。 ... [详细]
  • NOI题库(noi.openjudge.cn):1.7 编程基础之字符串 T31 至 T35 详解与解析
    T31至T35题目详细解析了字符串处理的基础编程技巧。其中,T31涉及P型编码,要求将一个仅包含数字字符的字符串转换为特定格式的编码串。例如,输入字符串“111223”应输出相应的P型编码结果。其他题目则涵盖了字符串的多种操作和变换方法,包括但不限于子串提取、字符替换和模式匹配等,旨在提升编程者对字符串处理的综合能力。 ... [详细]
  • 本文探讨了将PEBuilder转换为DIBooter.sh的方法,重点介绍了如何将DI工具集成到启动层,实现离线镜像引导安装。通过使用DD命令替代传统的grub-install工具,实现了GRUB的离线安装。此外,还详细解析了bootice工具的工作原理及其在该过程中的应用,确保系统在无网络环境下也能顺利引导和安装。 ... [详细]
  • Go语言实现Redis客户端与服务器的交互机制深入解析
    在前文对Godis v1.0版本的基础功能进行了详细介绍后,本文将重点探讨如何实现客户端与服务器之间的交互机制。通过具体代码实现,使客户端与服务器能够顺利通信,赋予项目实际运行的能力。本文将详细解析Go语言在实现这一过程中的关键技术和实现细节,帮助读者深入了解Redis客户端与服务器的交互原理。 ... [详细]
  • 本文提供了 RabbitMQ 3.7 的快速上手指南,详细介绍了环境搭建、生产者和消费者的配置与使用。通过官方教程的指引,读者可以轻松完成初步测试和实践,快速掌握 RabbitMQ 的核心功能和基本操作。 ... [详细]
  • 本文深入探讨了 `ExpressionChangedAfterItHasBeenCheckedError` 错误的原因及其解决方案。通过分析 Angular 的变更检测机制,详细解释了该错误的发生条件,并提供了多种有效的应对策略,帮助开发者在实际开发中避免这一常见问题。 ... [详细]
  • 深入解析十大经典排序算法:动画演示、原理分析与代码实现
    本文深入探讨了十种经典的排序算法,不仅通过动画直观展示了每种算法的运行过程,还详细解析了其背后的原理与机制,并提供了相应的代码实现,帮助读者全面理解和掌握这些算法的核心要点。 ... [详细]
  • 使用Boost.Asio进行异步数据处理的应用程序主要依赖于两个核心概念:I/O服务和I/O对象。I/O服务抽象了操作系统接口,使得异步操作能够高效地执行。I/O对象则代表了具体的网络资源,如套接字和文件描述符,通过这些对象可以实现数据的读写操作。本文详细介绍了这两个概念在Boost.Asio中的应用及其在网络编程中的重要性。 ... [详细]
  • 题目要求为生日派对准备馅饼,共有n个馅饼和f个朋友。每个馅饼的半径已知。任务是将这些馅饼公平地分配给所有参与者,包括自己在内,确保每个人获得相同大小的馅饼。通过使用二分查找算法,可以高效地找到最优解,实现资源的合理分配。 ... [详细]
  • 表面缺陷检测数据集综述及GitHub开源项目推荐
    本文综述了表面缺陷检测领域的数据集,并推荐了多个GitHub上的开源项目。通过对现有文献和数据集的系统整理,为研究人员提供了全面的资源参考,有助于推动该领域的发展和技术进步。 ... [详细]
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社区 版权所有