bzoj 1497 最小割
2024-10-18 05:01:25
思路:最小割好难想啊,根本想不到。。
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 ;
}
/*
*/
最新文章
- 多线程中的锁系统(三)-WaitHandle、AutoResetEvent、ManualResetEvent
- C#:结构
- java 汉语转拼音(全拼,首字母)
- 小鼠迷宫问题【sdut1157】【dfs,bfs综合题目】
- groovyConsole — the Groovy Swing console
- 第18章 使用MariaDB数据库管理系统
- cocos2dx游戏开发&mdash;&mdash;微信打飞机学习笔记(八)&mdash;&mdash;EnemyLayer的搭建
- 递归函数与fibonacci
- underscore的封装和扩展
- 开机自动播放音乐的vbs
- hdu4671Backup Plan
- 配置ModSecurity防火墙与OWASP规则
- OpenIOC
- 依法使用Linux,反对Linux国产化
- 【Django】学习资料
- PHP curl请求https遇到的坑
- [HEOI2016/TJOI2016]游戏
- virtualbox中 Kali Linux安装增强功能
- python requests上传文件 tornado 接收文件
- wampserver的配置教程