热门标签 | 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



推荐阅读
  • 本文通过SystemTap工具详细分析了lvextend命令在SUSE12sp3系统上的执行流程。首先介绍了必要的软件安装步骤,随后展示了如何编写并运行SystemTap脚本来追踪命令执行过程中的函数调用,最后结合实际输出结果对关键函数进行了深入分析。 ... [详细]
  • 今天我在操作Git时遇到了一个问题,即我的仓库进入了分离的HEAD状态,这与之前讨论过的‘即使本地有更改,git push仍显示所有内容最新’的问题类似。 ... [详细]
  • 手把手教你构建简易JSON解析器
    本文将带你深入了解JSON解析器的构建过程,通过实践掌握JSON解析的基本原理。适合所有对数据解析感兴趣的开发者。 ... [详细]
  • 本文详细介绍了如何通过 `vue.config.js` 文件配置 Vue CLI 的打包和代理设置,包括开发服务器配置、跨域处理以及生产环境下的代码压缩和资源压缩。 ... [详细]
  • 重构:优化现有代码设计(第二版)笔记
    本文介绍了重构的基本概念,通过具体示例展示了如何提炼函数以处理过长的代码段,并探讨了多种重构技术,如分阶段重构、封装变量等。 ... [详细]
  • 首先说一下,这是我在CSDN上的第一个文章,其实这个账号早在几年前就申请了,不过当时只是为了下载一个资源,而且也不怎么懂信息技术相关的领域,后来就再也没怎么动过,直到今天我才开始使用这个账号 ... [详细]
  • Flutter入门指南:实现自动关闭的对话框与提示
    本文为Flutter系列教程的一部分,专注于讲解如何在Flutter应用中实现自动关闭的对话框和提示。通过具体的代码示例,帮助开发者掌握SnackBar、BottomSheet和Dialog的使用方法。 ... [详细]
  • 使用Python轻松合并大量复杂Excel文件
    当面对大量的Excel文件时,如何高效地将它们合并成一个文件成为了一项挑战。本文将指导初学者如何利用Python的几个库,在几十行代码内完成这一任务。 ... [详细]
  • UnityNGUIScrollView苹果式滑动
    又回来写博客了,这回已经开始上班了,所以就发一发工作中解决的难题吧。单个展示Panel(苹果式)以前对UI的滑动组件很烦心,不是很会用,这回项目要求写一个类似于苹果的文件滑动效果, ... [详细]
  • 导读上一篇讲了zsh的常用字符串操作,这篇开始讲更为琐碎的转义字符和格式化输出相关内容。包括转义字符、引号、print、printf的使用等等。其中很多内容没有必要记忆,作为手册参 ... [详细]
  • 探索PWA H5 Web App优化之路(Service Worker与Lighthouse的应用)
    本文探讨了如何通过Service Worker和Lighthouse工具来优化PWA H5 Web App,旨在提升用户体验,包括提高加载速度、增强离线访问能力等方面。 ... [详细]
  • 本文探讨了为何采用RESTful架构及其优势,特别是在现代Web应用开发中的重要性。通过前后端分离和统一接口设计,RESTful API能够提高开发效率,支持多种客户端,并简化维护。 ... [详细]
  • 本文详细探讨了在Windows Server 2003环境下遇到MySQL连接失败(错误代码10061)的解决方案,包括通过卸载特定的Windows更新和调整系统注册表设置的方法。 ... [详细]
  • C语言实现句子中单词顺序反转
    本题源自《C语言程序设计——现代方法》第八章编程练习14,要求编写一个程序,能够接收用户输入的一句话,并将其中的单词顺序进行反转。 ... [详细]
  • 实现‘点击恢复’功能 - Tap-to-Resume Feature in SpriteKit
    了解如何在应用程序从非活动状态返回时,在SpriteKit游戏中添加一个‘点击恢复’的文字提示。 ... [详细]
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社区 版权所有