HDU-5889 Barricade
题目大意:
给你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相关推荐
- HDU - 5889 Barricade(最短路+最小割-最大流)
题目链接:点击查看 题目大意:给出一张无向图,每条边的长度为1,第i条边建立障碍的花费为wi,题目要求在保证从1到n号点的所有的最短路径上,都有障碍的情况下的最小费用 题目分析:要求最短路上的最小割, ...
- 【HDU - 5889】Barricade(最短路+网络流,最小割)
题干: The empire is under attack again. The general of empire is planning to defend his castle. The la ...
- poj迷宫游戏c语言代码,ACM/ICPC 之 BFS-简单障碍迷宫问题(POJ2935)
题目确实简单,思路很容易出来,难点在于障碍的记录,是BFS迷宫问题中很经典的题目了. POJ2935-Basic Wall Maze 题意:6*6棋盘,有三堵墙,求从给定初始点到给定终点的最短路,输出 ...
- HDU 4389 - X mod f(x)
题目地址: http://acm.hdu.edu.cn/showproblem.php?pid=4389 2012多校,第9场,1010 . 问题是,询问区间内 存在多少个 哈沙德数(Harshad ...
- hdu 4389 囧,打表
http://acm.hdu.edu.cn/showproblem.php?pid=4389 题意 :一个数能被他各个位数之和整除则符合要求,给L,R,问区间里有多少个数符合要求. 囧,居然打表就能过 ...
- HDU——1106排序(istringstream的使用、STLvector练习)
排序 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Submiss ...
- hdu 5438 Ponds 拓扑排序
Ponds Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://acm.hdu.edu.cn/contests/contest_showproblem ...
- HDU 1248 寒冰王座(全然背包:入门题)
HDU 1248 寒冰王座(全然背包:入门题) http://acm.hdu.edu.cn/showproblem.php?pid=1248 题意: 不死族的巫妖王发工资拉,死亡骑士拿到一张N元的钞票 ...
- hdu 1312 Red and Black 解题报告
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1312 第二条深搜,题目并不难,但是做了我好久好久,由于一个细节,让我赌上了一个晚上的时间. 题目大意: ...
- HDU 1429 胜利大逃亡(续) (BFS+位压缩)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1429 胜利大逃亡(续) Time Limit: 4000/2000 MS (Java/Others) ...
最新文章
- [NHibernate] Guid 作主键速度超慢的背后
- IE, FireFox, Opera 浏览器支持CSS实现Alpha半透明的方法
- 那些年我们一起追过的大佬
- SQL Server查询中特殊字符的处理方法
- 软件工程生命周期模型_软件生命周期模型比较| 软件工程
- [心得]编写服务端的相关设计心得及体会
- file java详解_Java中File的实例详解
- 栈和队列基本概念,顺序栈的表示和实现
- Ubuntu安装rz sz
- python 处理excel公式_python 处理excel踩过的坑——data_only,公式全部丢失
- Excel如何让单元数据显示单位又能参与运算?
- OSChina 周四乱弹 —— 当你简历注水但还是找到了工作
- MC开服教程2:材质包法自定义唱片音乐
- Python面向对象版学员管理系统(附源码)
- 前端架构设计应该包含哪些东西?
- 弹幕的开发(DanmakuFlameMaster)
- 大数据 智能交通调度_当大数据邂逅智能交通
- VRRP协议详解-----(1)
- Ubuntu下N卡配置无法保存的解决办法
- Lifekeeper Linux