题目大意:

给你n个点,有m条边,让你求出这个图的最短路上的最小割,这个最小割。

解题思路:

直接求出最短路图然后dinic跑最小割就行。

我遇到的一些错误点:

1、用dinic算法求解最小割需要使用当前弧优化,否则会TLE

2、最短路图注意求最短路的时候,每个边都是长度为1,也就是说可以bfs求。千万不要把权值当成边长

3、构造最短路图注意不要重复构造

代码:

#include <queue>
#include <cstdio>
#include <vector>
#include <cstring>
#include <algorithm>
using namespace std;typedef struct node {int v, cap, nxt;node(int a = 0, int b = 0, int c = 0) {v = a; cap = b; nxt = c;}
}Edge;const int maxn = 1005;
const int maxm = 400005;
const int inf = 0x3f3f3f3f;Edge vec[maxm];
int cnt, vis[maxn], first[maxn];int s, t;
Edge edge[maxm];
int tot, cur[maxn], head[maxn], dis[maxn];void add(int u, int v, int cap) {edge[tot] = Edge(v, cap, head[u]);head[u] = tot++;edge[tot] = Edge(u, 0, head[v]);head[v] = tot++;
}
void addEdge(int u, int v, int w) {vec[cnt] = Edge(v, w, first[u]);first[u] = cnt++;vec[cnt] = Edge(u, w, first[v]);first[v] = cnt++;
}
void BFS(int n) {int x;queue<int> q;while (!q.empty()) q.pop();memset(vis, 0, sizeof(vis));q.push(1); vis[1] = 1;while (!q.empty()) {x = q.front(); q.pop();for (int i = first[x]; ~i; i = vec[i].nxt) {Edge &e = vec[i];if (!vis[e.v]) {vis[e.v] = vis[x] + 1;q.push(e.v);}}}
}
void BuildGraph(int n, int pre) {if (dis[n]) return;dis[n] = 1;for (int i = first[n]; ~i; i = vec[i].nxt) {Edge &e = vec[i];if (e.v != pre && vis[n] == vis[e.v] + 1) {add(e.v, n, e.cap);BuildGraph(e.v, n);}}
}
int bfs() {int x;queue<int> q;while (!q.empty()) q.pop();memset(dis, 0, sizeof(dis));dis[s] = 1; q.push(s);while (!q.empty()) {x = q.front(); q.pop();for (int i = head[x]; ~i; i = edge[i].nxt) {Edge &e = edge[i];if (e.cap && dis[e.v] == 0) {dis[e.v] = dis[x] + 1;q.push(e.v);}}}return dis[t];
}
int dfs(int x, int f) {int sum = 0;if (x == t) return f;for (int &i = cur[x]; ~i; i = edge[i].nxt) {Edge &e = edge[i];if (e.cap && dis[e.v] == dis[x] + 1) {int ret = dfs(e.v, min(e.cap, f));sum += ret; f -= ret;e.cap -= ret; edge[i ^ 1].cap += ret;}}return sum;
}
int dinic() {int ret = 0;while (bfs()) {for (int i = s; i <= t; ++i) cur[i] = head[i];ret += dfs(s, inf);}return ret;
}
int main() {int a, b, c, n, m, cas;scanf("%d", &cas);while (cas--) {scanf("%d%d", &n, &m);cnt = 0; tot = 0; s = 1; t = n;memset(dis, 0, sizeof(dis));memset(head, -1, sizeof(head));memset(first, -1, sizeof(first));for (int i = 0; i < m; ++i) {scanf("%d%d%d", &a, &b, &c);addEdge(a, b, c);}BFS(n);BuildGraph(n, n);int ans = dinic();printf("%d\n", ans);}return 0;
}

转载于:https://www.cnblogs.com/wiklvrain/p/8179354.html

HDU-5889 Barricade相关推荐

  1. HDU - 5889 Barricade(最短路+最小割-最大流)

    题目链接:点击查看 题目大意:给出一张无向图,每条边的长度为1,第i条边建立障碍的花费为wi,题目要求在保证从1到n号点的所有的最短路径上,都有障碍的情况下的最小费用 题目分析:要求最短路上的最小割, ...

  2. 【HDU - 5889】Barricade(最短路+网络流,最小割)

    题干: The empire is under attack again. The general of empire is planning to defend his castle. The la ...

  3. poj迷宫游戏c语言代码,ACM/ICPC 之 BFS-简单障碍迷宫问题(POJ2935)

    题目确实简单,思路很容易出来,难点在于障碍的记录,是BFS迷宫问题中很经典的题目了. POJ2935-Basic Wall Maze 题意:6*6棋盘,有三堵墙,求从给定初始点到给定终点的最短路,输出 ...

  4. HDU 4389 - X mod f(x)

    题目地址: http://acm.hdu.edu.cn/showproblem.php?pid=4389 2012多校,第9场,1010 . 问题是,询问区间内 存在多少个 哈沙德数(Harshad ...

  5. hdu 4389 囧,打表

    http://acm.hdu.edu.cn/showproblem.php?pid=4389 题意 :一个数能被他各个位数之和整除则符合要求,给L,R,问区间里有多少个数符合要求. 囧,居然打表就能过 ...

  6. HDU——1106排序(istringstream的使用、STLvector练习)

    排序 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submiss ...

  7. hdu 5438 Ponds 拓扑排序

    Ponds Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://acm.hdu.edu.cn/contests/contest_showproblem ...

  8. HDU 1248 寒冰王座(全然背包:入门题)

    HDU 1248 寒冰王座(全然背包:入门题) http://acm.hdu.edu.cn/showproblem.php?pid=1248 题意: 不死族的巫妖王发工资拉,死亡骑士拿到一张N元的钞票 ...

  9. hdu 1312 Red and Black 解题报告

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1312 第二条深搜,题目并不难,但是做了我好久好久,由于一个细节,让我赌上了一个晚上的时间. 题目大意: ...

  10. HDU 1429 胜利大逃亡(续) (BFS+位压缩)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1429 胜利大逃亡(续) Time Limit: 4000/2000 MS (Java/Others)  ...

最新文章

  1. [NHibernate] Guid 作主键速度超慢的背后
  2. IE, FireFox, Opera 浏览器支持CSS实现Alpha半透明的方法
  3. 那些年我们一起追过的大佬
  4. SQL Server查询中特殊字符的处理方法
  5. 软件工程生命周期模型_软件生命周期模型比较| 软件工程
  6. [心得]编写服务端的相关设计心得及体会
  7. file java详解_Java中File的实例详解
  8. 栈和队列基本概念,顺序栈的表示和实现
  9. Ubuntu安装rz sz
  10. python 处理excel公式_python 处理excel踩过的坑——data_only,公式全部丢失
  11. Excel如何让单元数据显示单位又能参与运算?
  12. OSChina 周四乱弹 —— 当你简历注水但还是找到了工作
  13. MC开服教程2:材质包法自定义唱片音乐
  14. Python面向对象版学员管理系统(附源码)
  15. 前端架构设计应该包含哪些东西?
  16. 弹幕的开发(DanmakuFlameMaster)
  17. 大数据 智能交通调度_当大数据邂逅智能交通
  18. VRRP协议详解-----(1)
  19. Ubuntu下N卡配置无法保存的解决办法
  20. Lifekeeper Linux

热门文章

  1. 词云python灿烈,Python jieba分词、词云、文件读取、函数调用、匿名函数
  2. 《深入理解JVM》读书笔记
  3. char *s 与 char s[ ]的区别
  4. Chrome网页性能分析工具
  5. kendoGrid动态列的实现-高级查询结果展示优化过程
  6. IPv6套接字地址结构
  7. 滚动条滚动到页面底部继续加载
  8. 缓存与IO(很经典)
  9. #16192董哥授课的CCNP交换部分总结(三)
  10. 粒子滤波与PF目标追踪