集合冲突模型

1.问题形式
有 n 个物品和两个集合 S,T。将一个物品放入 S 集合会花费 ai,放入 T 集合会花费 bi。还有若干个形如 u,v,w 限制条件,表示如果 u 和 v 同时不在一个集合会花费 w。每个物品必须且只能属于一个集合,求最小的代价。
2.解决方法

  1. 我们对于每个集合设置源点 S 和汇点 T
  2. 第 i 个点由 S 连一条容量为 bi的边、向 T 连一条容量为 ai的边。
  3. 对于限制条件 u,v,w,我们在 u,v 之间连容量为 w 的双向边。
  4. 注意到当 S 和 T 不相连时,S 能到达 i 代表物品 i 放入 S,i 能到达 T 代表物品 i 放入 T。
  5. 当割开 S→i 的边,意味着 i 放入 T;当割开 i→T 的边,意味着 i 放入 S;
  6. 当割开 u,v 之间的边,意味着 u,v 不放入同一个集合。因此最小割就是最小花费。

对于每个割集都对应一种集合划分方式
就是把1和2都放道T里面

这个是把1和2放到S里面


这是把1和2分开放!!


bzoj1934


题目大意:

n个人有两种不同的意见并且有许多朋友,需要让朋友间尽可能的统一意见(少发生冲突),如果一个人违反自己的本意也算冲突,求最少的冲突?


解题思路:

首先把人分成两份,意见为1的与源点连边,容量为1,否则与汇点连边,容量也设为1,表示更改自己意见的代价。
接着对每一对朋友之间连一条双向边,容量为1,表示朋友之间的冲突。


#include <bits/stdc++.h>
#define mid ((l + r) >> 1)
#define Lson rt << 1, l , mid
#define Rson rt << 1|1, mid + 1, r
#define ms(a,al) memset(a,al,sizeof(a))
#define log2(a) log(a)/log(2)
#define lowbit(x) ((-x) & x)
#define IOS std::ios::sync_with_stdio(0); cin.tie(0); cout.tie(0)
#define INF 0x3f3f3f3f
#define LLF 0x3f3f3f3f3f3f3f3f
#define f first
#define s second
#define endl '\n'
using namespace std;
const int N = 2e6 + 10, mod = 1e9 + 9;
const int maxn = 500010;
const long double eps = 1e-5;
const int EPS = 500 * 500;
typedef long long ll;
typedef unsigned long long ull;
typedef pair<int,int> PII;
typedef pair<ll,ll> PLL;
typedef pair<double,double> PDD;
template<typename T> void read(T &x) {x = 0;char ch = getchar();ll f = 1;while(!isdigit(ch)){if(ch == '-')f*=-1;ch=getchar();}while(isdigit(ch)){x = x*10+ch-48;ch=getchar();}x*=f;
}
template<typename T, typename... Args> void read(T &first, Args& ... args)  {read(first);read(args...);
}
struct node {int to, next, len;
}e[maxn];
int head[maxn], cnt;
int n, m, s, t;
inline void add(int from, int to, int len) {e[cnt] = {to,head[from],len};head[from] = cnt ++;
}int dp[maxn];
int arr[maxn], num;
int maxs = -1;int d[maxn],cur[maxn];
int pre[maxn], flow[maxn];bool bfs() {ms(d,0);queue<int> q;q.push(s); d[s] = 1;while(!q.empty()) {int u = q.front(); q.pop();for(int i = head[u]; ~i; i = e[i].next) {int v = e[i].to;if(d[v] || e[i].len <= 0) continue;q.push(v);d[v] = d[u] + 1;}}      for(int i = 0; i <= n; ++ i) cur[i] = head[i];return d[t] != 0;
}int dfs(int u, int flow) {if(u == t) return flow;for(int &i = cur[u]; ~i; i = e[i].next) {int v = e[i].to;if(d[u] + 1 != d[v] || e[i].len <= 0) continue;int delta = dfs(v,min(flow,e[i].len));if(delta <= 0) continue;e[i].len -= delta;e[i^1].len += delta;return delta;}return 0;
}int get_maxflow() {int maxFlow = 0, delta;while(bfs())//bfs进行构建最短路网络while(delta = dfs(s,INF))maxFlow += delta;return maxFlow;
}int main() {int tn, tm; scanf("%d%d", &tn, &tm);s = 0, t = tn + 1;n = t;memset(head, -1, sizeof head);for(int i = 1;i <= tn; ++ i){int x;scanf("%d", &x);if(x)add(s, i, 1),add(i, s, 0);else add(i, t, 1), add(t, i, 0);}while(tm --){int x, y;scanf("%d%d", &x, &y);add(x, y, 1);add(y, x, 1);}printf("%lld\n",get_maxflow());return 0;
}

最小割 ---- 集合冲突模型相关推荐

  1. 最小割 ---- 集合冲突模型 ----- P1646 [国家集训队]happiness

    题面: 高一一班的座位表是个n*m的矩阵,经过一个学期的相处,每个同学和前后左右相邻的同学互相成为了好朋友.这学期要分文理科了,每个同学对于选择文科与理科有着自己的喜悦值,而一对好朋友如果能同时选文科 ...

  2. 最小割 ---- 集合冲突模型 ---- AGC038 F - Two Permutations[详解]

    题目链接 题目大意: 给出两个排列P,QP,QP,Q.要求构造两个排列A,B.A,B.A,B. 要求:AiAiAi要么等于iii,要么等于PiPiPi;BiBiBi要么等于iii,要么等于QiQiQi ...

  3. 最小割 ---- 二分图最大独立集(集合冲突模型) ---- 骑士共存 方格取数(网络流24题)

    二分图独立集 定理: 二分图最大独立集=n - 二分图最大匹配 其实二分图独立集是特殊的一种最大权闭合子图.我们根据上文"收益"的思想,把选某个点的收益看为1,左部节点为正权点,右 ...

  4. 最大权闭合子图(最小割模型)

    1,定义: 1,最大权闭合子图是最小割的一个模型.即每一个子图中的每一个点,其出边的点也全应该在这个子图中.而所有子图中,其点的权值和最大就是最大权闭合子图. 2,构建该图,我们把所有正权值点与源点s ...

  5. SPOJ-OPTM Optimal Marks ★★(按位建图 最小割)

    [题意]给出一个无向图,每个点有一个标号mark[i],不同点可能有相同的标号.对于一条边(u, v),它的权值定义为mark[u] xor mark[v].现在一些点的标号已定,请决定剩下点的标号, ...

  6. Bzoj 2127 happiness 最小割

    happiness 题解: 将图转换成最小割. 将割完的图中与S相连的点看做选文科, 与T相连的点看做选理科. flow(s, u) = 文科值 flow(u,t) = 理科值 假设u 和 v 一起选 ...

  7. hdu 3879(最小割模型求解最大权闭合图)

    题意: 公司得到了一共N个可以作为通讯信号中转站的地址,而由于这些地址的地理位置差异,在不同的地方建造通讯中转站需要投入的成本也是不一样的,所幸在前期调查之后这些都是已知数据:建立第i个通讯中转站需要 ...

  8. BZOJ 2039: [2009国家集训队]employ人员雇佣 最小割 二元组建图模型

    2039: [2009国家集训队]employ人员雇佣 Time Limit: 20 Sec  Memory Limit: 259 MB Submit: 1614  Solved: 789 [Subm ...

  9. AcWing2279 网络战争 (01分数规划+网络流 最小割模型)

    原题链接:AcWing2279 网络战争 题目大意 给一个无向带权图,求将s和t分开的一个边割集,使得割集的平均边权最小,即最小化∑e∈cwe∣c∣\frac{\sum_{e\in c} w_e}{| ...

最新文章

  1. 【iOS UI】iOS 9 GUI 资源分享
  2. Android系列之Fragment(二)----Fragment的生命周期和返回栈
  3. sap 客户信贷配置与管理解析
  4. spring async 默认线程池_springboot:异步调用@Async
  5. 几种开源NOSQL数据库
  6. 用JS判断不同分辨率调用不同的CSS样式文件
  7. html项目_Python Selenium项目实战之添加发送HTML测试报告邮件!
  8. matlab动力学仿真_机械系统动力学MATLAB仿真(上)
  9. 十六进制转为float,float转为二进制
  10. poj 1141 Brackets Sequence(线性dp)
  11. 公众号获取token失败_恶意请求微信公众号token,导致access_token超过10万次解决思路...
  12. 360浏览器不能打开CSDN登陆页面
  13. 计算机上机操作表格试题,2013职称计算机考试Excel表格操作试题(1)
  14. 24种编程语言的Hello World程序
  15. 服务器lsass系统错误,电脑开机提示lsass.exe系统错误,安全帐户管理器初始化失败该怎么办?...
  16. Java用Freemarker 生成word文档
  17. python获取表格中的所有数据_【经验分享】用Python读取电子表格中的数据
  18. 笔迹宽度估计的低质量文本图像二值化(Robust Document Image Binarization Technique for Degraded Document Images)
  19. Springboot 之 HandlerMethodArgumentResolver 运用
  20. git连接远程仓库以及常用命令

热门文章

  1. MySQL数据库使用连接更新表中某个字段数据
  2. 文件列表出现分页按钮
  3. 网络工程师_记录的一些真题_2018上半年上午
  4. ACMNO.19 C语言-对角求和 求一个3×3矩阵对角线元素之和。 输入 矩阵 输出 主对角线 副对角线 元素和 样例输入 1 2 3 1 1 1 3 2 1 样例输出 3 7
  5. PyTorch中模型的可复现性
  6. 10分钟学会使用YOLO及Opencv实现目标检测
  7. MaxCompute2.0新功能介绍
  8. POJ3690:Constellations——题解
  9. traceroute/tracert--获取网络路由路径
  10. 动力节点Java培训告诉你Java线程的多功能用法