思路:最小割好难想啊,根本想不到。。

S -> 用户群 = c[ i ]

基站 -> T = p[ i ]

用户群 -> a[ i ] = inf

用户群 -> b[ i ] = inf

然后求最小割,答案就是全部收益的和 - 最小割。

为什么可以这样呢,对于每个用户群,我们可以不选他,就是把(S -> 用户群)这条边断掉,或者选他,就是把

(用户群 -> a[ i ] = inf ,用户群 -> b[ i ] = inf)就是把这两条边断掉。 这样求最小割就能得到答案。

稍微学了一下最大权闭合图, ans =  tot - c (tot 为权值为正的点的和,c 为最小割)。

#include<bits/stdc++.h>
#define LL long long
#define fi first
#define se second
#define mk make_pair
#define pii pair<int, int> using namespace std; const int N = 6e4 + ;
const int M = 2e5 + ;
const int inf = 0x3f3f3f3f;
const LL INF = 0x3f3f3f3f3f3f3f3f;
const int mod = 1e9 + ; int n, m, S, T, sum, tot, p[N], a, b, c, level[N], head[N]; struct Edge {
int to, w, nx;
}edge[M << ]; void add(int u, int v, int w) {
edge[tot].to = v;
edge[tot].w = w;
edge[tot].nx = head[u];
head[u] = tot++;
} bool bfs() {
memset(level, , sizeof(level));
queue<int> que;
que.push(S), level[S] = ; while(!que.empty()) {
int u = que.front(); que.pop();
if(u == T) return true; for(int i = head[u]; ~i; i = edge[i].nx) {
int v = edge[i].to, w = edge[i].w;
if(level[v] || w <= ) continue;
level[v] = level[u] + ;
que.push(v);
}
}
return false;
} int dfs(int u, int p) {
if(u == T) return p;
int ret = ;
for(int i = head[u]; ~i; i = edge[i].nx) {
int v = edge[i].to, w = edge[i].w;
if(level[v] != level[u] + || w <= ) continue;
int f = dfs(v, min(p - ret, w));
ret += f;
edge[i].w -= f;
edge[i ^ ].w += f;
if(ret == p) break;
} if(!ret) level[u] = ;
return ret;
} int Dinic() {
int ans = ;
while(bfs()) ans += dfs(S, inf);
return ans;
} void init() {
tot = ; sum = ;
memset(head, -, sizeof(head));
} int main() {
init();
scanf("%d%d", &n, &m);
S = , T = n + m + ; for(int i = ; i <= n; i++) {
scanf("%d", &p[i]);
add(i + m, T, p[i]);
add(T, i + m, );
} for(int i = ; i <= m; i++) {
scanf("%d%d%d", &a, &b, &c);
add(S, i, c), add(i, S, );
add(i, a + m, inf), add(a + m, i, );
add(i, b + m, inf), add(b + m, i, );
sum += c;
}
int ans = Dinic();
printf("%d\n", sum - ans);
return ;
}
/*
*/

最新文章

  1. 多线程中的锁系统(三)-WaitHandle、AutoResetEvent、ManualResetEvent
  2. C#:结构
  3. java 汉语转拼音(全拼,首字母)
  4. 小鼠迷宫问题【sdut1157】【dfs,bfs综合题目】
  5. groovyConsole — the Groovy Swing console
  6. 第18章 使用MariaDB数据库管理系统
  7. cocos2dx游戏开发&mdash;&mdash;微信打飞机学习笔记(八)&mdash;&mdash;EnemyLayer的搭建
  8. 递归函数与fibonacci
  9. underscore的封装和扩展
  10. 开机自动播放音乐的vbs
  11. hdu4671Backup Plan
  12. 配置ModSecurity防火墙与OWASP规则
  13. OpenIOC
  14. 依法使用Linux,反对Linux国产化
  15. 【Django】学习资料
  16. PHP curl请求https遇到的坑
  17. [HEOI2016/TJOI2016]游戏
  18. virtualbox中 Kali Linux安装增强功能
  19. python requests上传文件 tornado 接收文件
  20. wampserver的配置教程

热门文章

  1. springMVC参数绑定与数据回显
  2. Python基础之面向对象(初级篇)
  3. libc、glibc与gcc
  4. 洛谷 U3357 C2-走楼梯
  5. linux命令df中df -h和df -i的区别
  6. C#为何不推荐在构造函数中访问虚成员
  7. 伪ajax操作
  8. java检验银行卡号
  9. 爬行百度标题&amp;URL案例
  10. 64_p6